也许不是最优雅的方式,但这似乎有效:
defaultdict
首先,我们使用of将列表列表转换为字典defaultdicts
,defaultdicts
也就是infinitedict
myList = [['ItemB','ItemZ'],['ItemB','ItemP'],['ItemB','ItemJ','Item6'],['ItemB','ItemJ','Item5']]
from collections import defaultdict
infinitedict = lambda: defaultdict(infinitedict)
dictionary = infinitedict()
for item in myList:
d = dictionary
for i in item:
d = d[i]
现在,我们可以使用递归函数将该字典转换回树形列表:
def to_list(d):
lst = []
for i in d:
lst.append(i)
if d[i]:
lst.append(to_list(d[i]))
return lst
输出与您的预期输出有点不同,但这对我来说似乎更有意义:
>>> print(to_list(dictionary))
['ItemB', ['ItemZ', 'ItemJ', ['Item6', 'Item5'], 'ItemP']]
或者,更接近您的预期结果(但仍然不完全相同,因为由于字典的中间步骤,顺序被打乱了),而不是使用:
def to_list(d):
return [[i] + [to_list(d[i])] if d[i] else i for i in d]
输出:
>>> print(to_list(dictionary)[0])
['ItemB', ['ItemZ', ['ItemJ', ['Item6', 'Item5']], 'ItemP']]