当前位置:  开发笔记 > 编程语言 > 正文

在同一循环中迭代两个列表

如何解决《在同一循环中迭代两个列表》经验,为你挑选了1个好方法。

如何在Python中迭代两个列表?我想要完全的结果

list1, list2, list3 = [0, 1], ['a', 'b'], [2, 3] # example data

for item in list1 + list2 + list3:
    print(item)

但我认为添加列表然后迭代它们并不高效.我使用for循环遍历列表:

for list_ in (list1, list2, list3):
    for item in list_:
        print(item)

但是当我检查这个timeit时,两者的执行时间非常相似.

有可能让它更快吗?



1> thefourtheye..:

对于小型数据集,您将找不到太多差异.但通常如果你想链接和迭代多个迭代,那么你可以itertools.chain像这样使用

>>> list1, list2, list3 = [0, 1], ['a', 'b'], [2, 3]
>>> from itertools import chain
>>> for item in chain(list1, list2, list3):
...     print(item)
0
1
a
b
2
3

这不会创建任何中间数据结构并逐个迭代每个迭代.返回的值chain是迭代器.所以这也不会创建一个包含所有项目的容器,如果迭代会非常大,那么它的内存效率非常高.

并且itertools.chain实际上与您的第二种方法相同.引用官方文档中的等效实现

def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

如果我们查看为您显示的第一个程序生成的字节代码,请使用此代码

from dis import dis
list1, list2, list3 = [0, 1], ['a', 'b'], [2, 3]


def func():
    for item in list1 + list2 + list3:
        print(item)

dis(func)

它会是这样的

  6           0 SETUP_LOOP              27 (to 30)
              3 LOAD_GLOBAL              0 (list1)
              6 LOAD_GLOBAL              1 (list2)
              9 BINARY_ADD          
             10 LOAD_GLOBAL              2 (list3)
             13 BINARY_ADD          
             14 GET_ITER            
        >>   15 FOR_ITER                11 (to 29)
             18 STORE_FAST               0 (item)

  7          21 LOAD_FAST                0 (item)
             24 PRINT_ITEM          
             25 PRINT_NEWLINE       
             26 JUMP_ABSOLUTE           15
        >>   29 POP_BLOCK           
        >>   30 LOAD_CONST               0 (None)
             33 RETURN_VALUE        

如您所见,BINARY_ADD代码使用了两次.这意味着首先添加list1list2添加一个临时列表,并再次添加list3.如果任何列表非常大,这将是非常低效的.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有