我想更改下面的代码
for directory, dirs, files in os.walk(directory_1):
do_something()
for directory, dirs, files in os.walk(directory_2):
do_something()
到此代码:
for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2):
do_something()
我得到了错误:
不支持+:'generator'和'generator'的操作数类型
如何在Python中连接两个生成器?
如果你想保持生成器的分离,但仍然在同一时间遍历它们,你可以使用zip():
注意:迭代停止在两个生成器中较短的一个
例如:
for (root1, dir1, files1), (root2, dir2, files2) in zip(os.walk(path1), os.walk(path2)):
for file in files1:
#do something with first list of files
for file in files2:
#do something with second list of files
如果你只需要做一次,不希望再导入一个模块,有一个简单的解决方案…
只做:
for dir in directory_1, directory_2:
for directory, dirs, files in os.walk(dir):
do_something()
如果你真的想“联接”两个生成器,那么做:
for directory, dirs, files in (
x for osw in [os.walk(directory_1), os.walk(directory_2)]
for x in osw
):
do_something()
2020年更新:在Python 3和Python 2中都可以工作
import itertools
iterA = range(10,15)
iterB = range(15,20)
iterC = range(20,25)
第一个选项
for i in itertools.chain(iterA, iterB, iterC):
print(i)
# 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
可选选项,在python 2.6中引入
for i in itertools.chain.from_iterable( [iterA, iterB, iterC] ):
print(i)
# 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Itertools.chain()是基本的。
Itertools.chain.from_iterable()很方便,如果你有一个包含可迭代对象的可迭代对象。例如,每个子目录的文件列表,如[["src/server.py", "src/readme.txt"], ["test/test.py"]]]。
这里使用了一个带有嵌套for的生成器表达式:
range_a = range(3)
range_b = range(5)
result = (item
for one_range in (range_a, range_b)
for item in one_range)
assert list(result) == [0, 1, 2, 0, 1, 2, 3, 4]
for…在…从左到右求值。for之后的标识符建立一个新变量。而one_range在下面用于…在…,来自第二个的项用于“final”赋值表达式,该表达式只有一个(在最开始)。