我想遍历列表清单。
我想迭代列表中不规则嵌套的列表。
任何人都可以让我知道我该怎么做?
x = [u'sam', [['Test', [['one', [], []]], [(u'file.txt', ['id', 1, 0])]], ['Test2', [], [(u'file2.txt', ['id', 1, 2])]]], []]
答案 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 ')