排序/组合列表列表

时间:2014-06-18 11:04:14

标签: python xml sorting python-2.7

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

[
[['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(),然后使用itemgettergroupby但我看到每个列表中的元素数量不同。我该如何解决这个问题?

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

1 个答案:

答案 0 :(得分:3)

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

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编写的东西。