遍历列表列表和单个元素

给定以下列表,


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)


慕雪6442864
浏览 132回答 4
4回答

尚方宝剑之说

一种不需要类型检查并避免重复自己的“pythonic”方法是使用所谓的 EAFP ( “请求宽恕比请求许可更容易”)编码风格。以下是如何将其应用于此场景: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

慕哥6287543

问题是你有一个集合,其中每个元素可以是一个集合或单个元素。如果您想避免扁平化,并且@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,但这应该适合你。ps说真的,我不懂python。你只需拿起东西,我在 REPL 中运行它来验证它。

拉风的咖菲猫

您可以通过定义返回生成器的函数将附加逻辑移出循环:def flatten(items):    for item in items:        if isinstance(item, list):            yield from flatten(item)        else:            yield itema = [[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!您可以验证上面代码的输出:123112435123446.511245

慕码人8056858

编写一个递归函数来为你做这件事:def print_my_list(lst):    for elem in lst:        if type(elem) is list:            print_my_list(elem)        else:            print(elem)一件好事是,这将适用于相互嵌套的任意数量的列表,将它们全部“展平”。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python