48 votes

Itérer dans la liste de la liste en Python

Je veux parcourir la liste de la liste. Je souhaite également parcourir les listes imbriquées de manière irrégulière à l'intérieur de la liste. Quelqu'un peut-il me dire comment puis-je faire cela?

 x = [u'sam', [['Test', [['one', [], []]], [(u'file.txt', ['id', 1, 0])]], ['Test2', [], [(u'file2.txt', ['id', 1, 2])]]], []]

53voto

Jeremy Banks Points 32470

Cette traverse peut être utilisée pour itérer sur toutes les valeurs :

 def traverse(o, tree_types=(list, tuple)):
    if isinstance(o, tree_types):
        for value in o:
            for subvalue in traverse(value, tree_types):
                yield subvalue
    else:
        yield o

data = [(1,1,(1,1,(1,"1"))),(1,1,1),(1,),1,(1,(1,("1",)))]
print list(traverse(data))
# prints [1, 1, 1, 1, 1, '1', 1, 1, 1, 1, 1, 1, 1, '1']

for value in traverse(data):
    print repr(value)
# prints
# 1
# 1
# 1
# 1
# 1
# '1'
# 1
# 1
# 1
# 1
# 1
# 1
# 1
# '1'

17voto

igniteflow Points 1247

Cela peut également être réalisé avec itertools.chain.from_iterable qui aplatira les itérables consécutifs :

 import itertools
for item in itertools.chain.from_iterable(iterables):
    # do something with item    

5voto

robert king Points 5369

si vous ne voulez pas de récursivité, vous pouvez essayer :

 x = [u'sam', [['Test', [['one', [], []]], [(u'file.txt', ['id', 1, 0])]], ['Test2', [], [(u'file2.txt', ['id', 1, 2])]]], []]
layer1=x
layer2=[]
while True:
    for i in layer1:
        if isinstance(i,list):
            for j in i:
                layer2.append(j)
        else:
            print i
    layer1[:]=layer2
    layer2=[]
    if len(layer1)==0:
        break

qui donne:

 sam
Test
Test2
(u'file.txt', ['id', 1, 0])
(u'file2.txt', ['id', 1, 2])
one

(notez qu'il n'a pas examiné les tuples pour les listes car les tuples ne sont pas des listes. Vous pouvez ajouter des tuples à la méthode "isinstance" si vous souhaitez résoudre ce problème)

4voto

Codie CodeMonkey Points 3936

Il semble que vous deviez utiliser la récursivité. Créez une fonction pour parcourir une liste, et si elle atteint un élément qui est également une liste, s'appeler pour itérer sur le membre. Voici un lien vers quelque chose de similaire :

http://www.saltycrane.com/blog/2008/08/python-recursion-example-navigate-tree-data/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X