问题描述
|
我想遍历列表清单。
我也想遍历list中不规则嵌套的列表。
谁能告诉我该怎么做?
x = [u\'sam\',[[\'Test\',[[\'one\',[],[]]],[(u\'file.txt\',[\'id\',1,0])]],[\'Test2\',[(u\'file2.txt\',2])]]],[]]
解决方法
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\",)))]
print list(traverse(data))
# prints [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\'
, 所以等等,这只是列表中的列表?
最简单的方法可能只是使用嵌套的for循环:
>>> a = [[1,3,4],[2,4,[3,5]]
>>> a
[[1,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
, 这也可以通过itertools.chain.from_iterable来实现,它将平坦化连续的iterable:
import itertools
for item in itertools.chain.from_iterable(iterables):
# do something with item
, 如果您不想递归,可以尝试:
x = [u\'sam\',[[\'Test\',[[\'one\',[],[]]],[(u\'file.txt\',[\'id\',0])]],[\'Test2\',[(u\'file2.txt\',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\',0])
(u\'file2.txt\',2])
one
(请注意,它没有查看列表的元组,因为元组不是列表。如果要解决此问题,可以将元组添加到\“ isinstance \”方法中)
, 听起来您需要使用递归。构造一个函数以遍历列表,如果该命中项也是一个列表项,则调用自身以对该成员进行迭代。这是指向类似内容的链接:
http://www.saltycrane.com/blog/2008/08/python-recursion-example-navigate-tree-data/
, 如果您想在同一列表中获取所有值,可以使用以下代码:
text = [u\'sam\',[]]
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)
, x = [u\'sam\',[]]
output = []
def lister(l):
for item in l:
if type(item) in [list,tuple,set]:
lister(item)
else:
output.append(item)
lister(x)
, 创建一个方法来递归地迭代嵌套列表。如果当前元素是list的实例,则再次调用相同的方法。如果不是,则打印当前元素。这是一个例子:
data = [1,2,[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)
, 两个嵌套的循环?
for a in x:
print \"--------------\"
for b in a:
print b
如果您举了一个您想对清单做些什么的例子,那将会有所帮助