给出以下列表,
a = [[1,2,3],1,[1,2,43,5],[1,23,4,4],6.5,[1,1,2,45]]
我想遍历所有要素。如您所见,当子集只有一个元素时,我没有列表1,而只有一个元素。因此,这当然是行不通的,因为a
的第二个元素不可迭代,
for x in a:
for i in x:
print(i)
#do much more
错误:
for i in x:
TypeError: 'int' object is not iterable
我可以执行以下操作,但是我发现它非常不方便,因为我必须复制代码或在'#do much more
部分中调用函数。有想法吗?
for x in a:
if type(x) is list:
for i in x:
print(i)
#do much more
else:
print(x)
#do much more (the same as above)
答案 0 :(得分:3)
问题是您有一个集合,其中每个元素可以是集合或单个元素。如果要避免扁平化,并且@ green-cloak-guy的扁平化输出不适合您的用法,则可以在使用之前整理数据,以便可以将其用作保证的列表列表。>
a = [[1,2,3],1,[1,2,43,5],[1,23,4,4],6.5,[1,1,2,45]]
for x in a:
if not isinstance(x, list):
x = [x]
for i in x:
print(i)
#do much more
我真的不认识python,但这应该可以帮到你。
p.s。说真的,我不懂python。您只需拿起东西,然后我在REPL中运行它以进行验证。
答案 1 :(得分:3)
一种不需要类型检查并且避免重复的“ pythonic”方法就是使用 EAFP (“宽恕比许可容易” )的编码风格(请参见另一个问题的my answer 有关更多详细信息)。
以下是将其应用于这种情况的方法:
a = [[1,2,3],1,[1,2,43,5],[1,23,4,4],6.5,[1,1,2,45]]
for x in a:
try:
it = iter(x)
except TypeError:
it = [x]
for i in it:
print(i)
#do much more
答案 2 :(得分:2)
编写一个递归函数来为您做这件事:
def print_my_list(lst):
for elem in lst:
if type(elem) is list:
print_my_list(elem)
else:
print(elem)
一件好事是,这将适用于彼此嵌套的任何数量的列表,将它们全部“压平”。
答案 3 :(得分:2)
您可以通过定义返回生成器的函数来将其他逻辑移出循环:
def flatten(items):
for item in items:
if isinstance(item, list):
yield from flatten(item)
else:
yield item
a = [[1,2,3],1,[1,2,43,5],[1,23,4,4],6.5,[1,1,2,45]]
for i in flatten(a):
print(i)
# Your logic here!
您可以验证上面代码的输出:
1
2
3
1
1
2
43
5
1
23
4
4
6.5
1
1
2
45