迭代Python中的列表列表

时间:2011-06-14 07:25:32

标签: python list

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

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

10 个答案:

答案 0 :(得分:45)

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'

答案 1 :(得分: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

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

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

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

答案 2 :(得分:14)

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

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

答案 3 :(得分: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

给出:

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

(请注意,它没有查看列表的元组,因为元组不是列表。如果要修复此问题,可以将元组添加到“isinstance”方法中)

答案 4 :(得分:4)

听起来你需要使用递归。创建一个迭代列表的函数,如果它遇到一个也是列表的项,则调用自己迭代该成员。这是类似的链接:

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

答案 5 :(得分:4)

如果您想要在同一个列表中获取所有值,可以使用以下代码:

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

def get_values(lVals):
    res = []
    for val in lVals:
        if type(val) not in [list, set, tuple]:
            res.append(val)
        else:
            res.extend(get_values(val))
    return res

get_values(text)

答案 6 :(得分:2)

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

def lister(l):
    for item in l:
        if type(item) in [list, tuple, set]:
            lister(item)
        else:
            output.append(item)

lister(x)

答案 7 :(得分:1)

两个嵌套for循环?

 for a in x:
     print "--------------"
     for b in a:
             print b

如果你举例说明你想对列表做什么

,那会有所帮助

答案 8 :(得分:1)

创建一个迭代嵌套列表的方法。 如果当前元素是列表的实例,则再次调用相同的方法。举个例子。

data = [1,2,3,[4,[5,6,7,[8,9]]]]

def print_list(the_list):

    for each_item in the_list:
        if isinstance(each_item, list):
            print_list(each_item)
        else:
            print(each_item)

print_list(data)

答案 9 :(得分:0)

# house list of lists
house = [["hallway", 11.25], ["kitchen", 18.0], ["living room", 20.0], 
         ["bedroom", 10.75], ["bathroom", 9.50]]
         
for key, y in house :
    print('The ' + key + ' is ' + str(y) + ' sqm ')