迭代Python中的列表列表

sam*_*sam 40 python list

我想遍历列表列表.
我想迭代列表中的不规则嵌套列表.
任何人都可以让我知道我该怎么做?

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

小智 48

traverse生成器函数可用于迭代所有值:

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'
Run Code Online (Sandbox Code Playgroud)

  • @ nmz787如果你在顶级使用非默认参数,那么它将被遗忘在较低级别.尝试使用list(遍历([1,2,3,set([4,5,6])],tree_types =(list,set)))在第四行中使用和不使用显式调用tree_types. (2认同)

vic*_*ooi 33

等等,这只是一个列表中的列表?

最简单的方法可能就是使用嵌套for循环:

>>> a = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
>>> a
[[1, 3, 4], [2, 4, 4], [3, 4, 5]]
>>> for list in a:
...     for number in list:
...         print number
...
1
3
4
2
4
4
3
4
5
Run Code Online (Sandbox Code Playgroud)

还是比这更复杂的东西?任意嵌套还是什么?如果还有别的东西,请告诉我们.

此外,出于性能原因,您可能希望使用列表推导来执行此操作:

http://docs.python.org/tutorial/datastructures.html#nested-list-comprehensions

  • 这种技术的问题在于它不允许任意深度的嵌套。在编写脚本时,您可以指定每个列表的深度,仅此而已。 (2认同)

ign*_*low 14

这也可以通过itertools.chain.from_iterable来实现,这会使连续的迭代变平:

import itertools
for item in itertools.chain.from_iterable(iterables):
    # do something with item    
Run Code Online (Sandbox Code Playgroud)

  • 它实际上是`itertools.chain.from_iterable` (7认同)

rob*_*ing 6

如果你不想要递归,你可以试试:

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
Run Code Online (Sandbox Code Playgroud)

这使:

sam
Test
Test2
(u'file.txt', ['id', 1, 0])
(u'file2.txt', ['id', 1, 2])
one
Run Code Online (Sandbox Code Playgroud)

(请注意,它看起来并不成元组列表,因为元组不是列表,你可以添加元组的"isinstance"的方法,如果你想解决这个问题)