我正在尝试根据文件名中的相似性组合一些文件。 我有一个文件名列表,基于标识符(子字符串)列表,我想组合这些文件。
我正在使用:
for i in identifyList:
print("\n".join(s for s in fileList if i.lower() in s.lower()))
当我运行此脚本时,文件以正确的顺序打印。但是我无法使用此声明的产品进行打印。 如果我将它分配给变量并打印变量,我会得到一个列表:
<generator object <genexpr> at longNumber>
我查看了如何使用发电机并发现它非常令人困惑。
任何想法? 干杯
答案 0 :(得分:0)
我怀疑你在某处获得了生成器对象,因为当你想使用列表推导时你正在使用生成器表达式。
列表理解看起来像[some_expression(variable) for variable in some_iterable if some_condition(variable)]
。这会生成一个列表,就像这个显式循环一样:
result = []
for variable in some some_iterable:
if some_condition(variable):
result.append(some_expression(variable))
优点是列表推导全部在一行,并且可以在允许表达式的任何地方完成(比如在函数调用中)而不创建任何额外的变量。
生成器表达式非常相似,它只是用可迭代的生成器对象替换列表,它在迭代中需要逐个生成值。如果要生成大量值并且我们不希望将它们全部保存在内存中,或者如果我们不关心保持列表,那么这可能是一个很大的优势。
生成器表达式的语法只是用括号替换列表推导的[]
方括号(如果生成器表达式是函数的唯一参数,则没有任何内容,因为函数调用的括号已经完成了工作)。
在您的代码中,对str.join
的调用使用生成器表达式作为(唯一)参数。如果你想用符合你条件的文件名做其他事情(而不是把它们连在一起),你可能想要使用列表理解:
for i in identifyList:
matches = [s for s in fileList if i.lower() in s.lower())]
# do something with the list here!