Hom*_*ing 158 python generator
我想更改以下代码
for directory, dirs, files in os.walk(directory_1):
do_something()
for directory, dirs, files in os.walk(directory_2):
do_something()
Run Code Online (Sandbox Code Playgroud)
这段代码:
for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2):
do_something()
Run Code Online (Sandbox Code Playgroud)
我收到错误:
+:'generator'和'generator'不支持的操作数类型
如何在Python中连接两个生成器?
Phi*_*ipp 208
我认为itertools.chain()应该这样做.
小智 56
代码示例:
from itertools import chain
def generator1():
for item in 'abcdef':
yield item
def generator2():
for item in '123456':
yield item
generator3 = chain(generator1(), generator2())
for item in generator3:
print item
Run Code Online (Sandbox Code Playgroud)
use*_*754 26
from itertools import chain
x = iter([1,2,3]) #Create Generator Object (listiterator)
y = iter([3,4,5]) #another one
result = chain(x, y) #Chained x and y
Run Code Online (Sandbox Code Playgroud)
Udu*_*use 26
在Python(3.5或更高版本)中,您可以:
def concat(a, b):
yield from a
yield from b
Run Code Online (Sandbox Code Playgroud)
使用itertools.chain.from_iterable,您可以执行以下操作:
def genny(start):
for x in range(start, start+3):
yield x
y = [1, 2]
ab = [o for o in itertools.chain.from_iterable(genny(x) for x in y)]
print(ab)
Run Code Online (Sandbox Code Playgroud)
2020 更新:可在 Python 3 和 Python 2 中工作
import itertools
iterA = range(10,15)
iterB = range(15,20)
iterC = range(20,25)
Run Code Online (Sandbox Code Playgroud)
第一个选择
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
Run Code Online (Sandbox Code Playgroud)
替代选项,在 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
Run Code Online (Sandbox Code Playgroud)
如果你有一个可迭代的可迭代对象,itertools.chain.from_iterable()会很方便。例如每个子目录的文件列表,例如[ ["src/server.py", "src/readme.txt"], ["test/test.py"] ].
在这里,它使用带有s 的生成器表达式for:
a = range(3)
b = range(5)
ab = (i for it in (a, b) for i in it)
assert list(ab) == [0, 1, 2, 0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
还可以使用解包运算符*:
concat = (*gen1(), *gen2())
Run Code Online (Sandbox Code Playgroud)
注意:对于“非惰性”迭代最有效。也可以用于不同类型的理解。生成器连接的首选方式来自@Uduse