我想更改下面的代码
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中连接两个生成器?
您可以将任何生成器放入列表中。虽然不能组合生成器,但可以组合列表。这样做的缺点是实际上在内存中创建了3个列表,但优点是可读性非常好,不需要导入,并且是单行习惯用法。
OP解决方案。
for directory, dirs, files in list(os.walk(directory_1)) + list(os.walk(directory_2)):
do_something()
a = range(20)
b = range(10,99,3)
for v in list(a) + list(b):
print(v)
如果你想从一个已知目录之前和之后获取文件路径列表,你可以这样做:
for r,d,f in os.walk(current_dir):
for dir in d:
if dir =='after':
after_dir = os.path.abspath(os.path.join(current_dir, dir))
for r,d,f in os.walk(after_dir):
after_flist.append([os.path.join(r,file)for file in f if file.endswith('json')])
elif dir =='before':
before_dir = os.path.abspath(os.path.join(current_dir, dir))
for r,d,f in os.walk(before_dir):
before_flist.append([os.path.join(r,file)for file in f if file.endswith('json')])
我知道有更好的答案,这是我觉得简单的代码。
假设我们有两个生成器(第1代和第2代),我们想要执行一些额外的计算,需要这两个生成器的结果。
我们可以通过map方法返回这种函数/计算的结果,该方法反过来返回一个生成器,我们可以循环使用它。
在这种情况下,函数/计算需要通过lambda函数实现。
棘手的部分是我们打算在映射及其lambda函数中做什么。
建议解决方案的一般形式:
def function(gen1,gen2):
for item in map(lambda x, y: do_somethin(x,y), gen1, gen2):
yield item