遍历列表和单个元素

时间:2020-08-24 22:45:54

标签: python list

给出以下列表,

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)

4 个答案:

答案 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