让我用一个例子来证明我的问题。 我的数据结构类似于下面提供的数据结构:
[
[['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。
答案 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编写的东西。