Peut-être pas la manière la plus élégante, mais cela semble fonctionner:
D'abord, nous nous tournons la liste des listes dans un dictionnaire en utilisant un defaultdict
de defaultdicts
de defaultdicts
, alias 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]
maintenant , nous pouvons utiliser une fonction récursive pour transformer ce dictionnaire en une liste arborescente:
def to_list(d):
lst = []
for i in d:
lst.append(i)
if d[i]:
lst.append(to_list(d[i]))
return lst
La sortie est un peu différent de votre résultat attendu, mais cela semble plus logique pour moi:
>>> print to_list(dictionary)
['ItemB', ['ItemZ', 'ItemJ', ['Item6', 'Item5'], 'ItemP']]
Ou, plus près de votre résultat attendu (mais toujours pas exactement la même chose, que l'ordre est escalada en raison de l'étape intermédiaire avec le dictionnaire) en utilisant ceci:
def to_list(d):
return [[i] + [to_list(d[i])] if d[i] else i for i in d]
sortie:
>>> print to_list(dictionary)[0]
['ItemB', ['ItemZ', ['ItemJ', ['Item6', 'Item5']], 'ItemP']]
S'il vous plaît ne hésitez pas à partager votre * J'ai pu approcher à l'aide d'une fonction récursive * –
Les deux listes semblent identiques, à mes yeux. Qu'est-ce que je rate? –
C'est un dictionnaire que vous voulez, mon ami. – 2rs2ts