示例1:
假设我有一个清单:[[1,2],[3,4]]。我可以使用两个for循环来打印出来:1,2,3,4。
示例2:
所以,现在让我们假设我有一个输出,我不知道list1中有多少嵌套列表:
list1 = [1,[1,2,[3,5,6,[..],...,]]]]]
所以,我的问题是如何以与第一个例子相同的格式打印出每个单独的数字。我现在正在处理一些事情,结果给了我嵌套列表,但是函数的不同输入将给我不同数量的嵌套列表。
我能想到的是这样做,但我不知道在实例部分之后该怎么做:
c = 0
for i in list1:
while c < len(list1):
if isinstance(i, list):
else:
print i
c += 1
由于
首次修改
如果还有一种方法可以解构所有嵌套列表,使其成为一个对我来说同样有用的列表,但我很想知道这两个问题的答案。
答案 0 :(得分:4)
itertools documentation有一些非常好的迭代列表等等的例子,因此在面对这样的任务时,它总是一个好的开始。
我建议使用生成器,这样可以避免创建多个级别的列表:
def flatten_all(iterable):
for elem in iterable:
if not isinstance(elem, list):
yield elem
else:
for x in flatten_all(elem):
yield x
# in Python 3.3 just: yield from flatten_all(elem)
应用:
for x in flatten_all([1, [2, [3]]]):
print(x)
# or if you need a list:
my_lst = list(flatten_all([1, [2, [3]]])
assert my_lst == [1, 2, 3]
编辑:非递归线性版
def flatten_all(iterable):
stack = [iter(iterable)]
while stack:
try:
elem = stack[-1].next()
if not isinstance(elem, list):
yield elem
else:
stack.append(iter(elem))
except StopIteration:
stack.pop()
答案 1 :(得分:1)
你可以尝试这样的事情(代码使你的列表变成一行,所以你可以在以后打印):
def make_flat(arr):
res = []
for l in arr:
if isinstance(l, list):# or isinstance(l, collections.Iterable)
res.extend(make_flat(l))
else:
res.append(l)
return res
flat = make_flat(list1)
for x in flat:
print x
或者:
def make_flat(arr):
return sum(map(lambda a: make_flat(a) if isinstance(a,(list)) else [a],arr),[])
答案 2 :(得分:1)
这是一个使用递归的例子:
list1 = [1, [2,3,4], [5, 6, 7, [8, 9]]]
def print_list(l):
for e in l:
if type(e) == list:
print_list(e)
else:
print e
print_list(list1)