【问题标题】:Sorting/Combining a list of lists排序/组合列表列表
【发布时间】:2014-08-08 15:39:19
【问题描述】:

让我用一个例子来说明我的问题。 我有一个类似于下面提供的数据结构:

[
[['A', 'B'], '1', '1...'],
[['A', 'B'], '2', '2...'],
[['A', 'C'], '3', '3...'],
[['A', 'C'], '4', '4...'],
[['A', 'A'], '5', '5...'],
[['A', 'D'], '6', '6...'],
[['C', 'A'], '7', '7...'],
[['D', 'C', 'B'], '8', "8..."],
[['D', 'A', 'B'], '9', "9..."],
[['D', 'A', 'A', 'Y'], '10', "10..."],
[['D', 'A', 'A', 'X'], '11', "11..."]
]

每个元素都以一个列表开头(该列表中的元素数量未知),后跟两个元素(最后两个元素不重要,它们只是文本)。 我想从此列表中创建一个新结构。我想根据第一个元素组合元素,如下所示:

'A'
    'A'
        '5', '5...'
    'B'
        '1', '1...'
        '2', '2...'
    'C'
        '3', '3...'
        '4', '4...'
    'D'
        '6', '6...'
'C'
    'A'
        '7', '7...'
'D'
    'A'
        'A'
            'X'
                '11', '11...'
            'Y'
                '10', '10...'
'D'
    'A'
        'B'
            '9', '9...'
    'C'
        'B'
            '8', '8...'

所以第一个元素(在第一个列表中)作为第一层,第二个元素作为第二层,依此类推。

我希望你能看到我想要做什么!我希望使用sort(),然后使用itemgetter 和groupby,但后来我看到每个列表中的元素数量不同。我该如何解决这个问题?

我需要创建这个新结构以创建原始输入的正确 XML。

【问题讨论】:

标签: python xml sorting python-2.7


【解决方案1】:

您可以使用嵌套字典将列表列表转换为树状结构:

result = {}
for row in data:
    path, item = row[0], row[1:]
    d = result
    for p in path[:-1]:
        d = d.setdefault(p, {})
    d.setdefault(path[-1], []).append(item)
print result

result 将如下所示(为便于阅读添加了缩进):

{'A': {'A': [['5', '5...']], 'C': [['3', '3...'], ['4', '4...']], 
       'B': [['1', '1...'], ['2', '2...']], 'D': [['6', '6...']]}, 
 'C': {'A': [['7', '7...']]}, 
 'D': {'A': {'A': {'Y': [['10', '10...']], 'X': [['11', '11...']]}, 
             'B': [['9', '9...']]}, 
       'C': {'B': [['8', '8...']]}}}

如果要对其进行排序,您可以先对数据进行排序并使用collection.OrderedDict 而不是普通的{},或者使用按排序顺序递归循环子字典的方法,如下所示:

def print_sorted(d, depth=0):
    if isinstance(d, dict):
        for k in sorted(d):
            print "  " * depth, k
            print_sorted(d[k], depth+1)
    else:
        print "  " * depth, d
print_sorted(result)

输出就像你的问题一样。你只需要添加 XML 编写的东西。

【讨论】:

  • 我不知道如何以这种方式遍历它,以便创建正确的 XML 标记。有任何想法吗?如果我使用递归,一旦它到达最内部的元素,我就会迷失方向。
  • 使用你的方法我实现了整个事情,突然间我意识到我错过了很多元素。 Dict 更新重复元素。因此,所有具有相同第一个元素的元素都将被删除。正如您在自己的输出中看到的那样,在您的打印输出中找不到元素 ['A', 'B'], '1', '1...'。
  • 已被 ['A', 'B'], '2', '2...'] 取代。我需要将它们作为元组或其他东西添加到同一个列表中
  • @theAlse 对,没看到。固定。
  • 我使用了你的修改版本,它工作正常 :) 谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-12-17
  • 2014-12-02
  • 1970-01-01
  • 2013-11-10
  • 2011-09-26
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多