使用子字符串来识别python中的文件名

时间:2016-02-08 04:14:01

标签: list file python-3.x

我正在尝试根据文件名中的相似性组合一些文件。 我有一个文件名列表,基于标识符(子字符串)列表,我想组合这些文件。

我正在使用:

    for i in identifyList:
        print("\n".join(s for s in fileList if i.lower() in s.lower()))

当我运行此脚本时,文件以正确的顺序打印。但是我无法使用此声明的产品进行打印。 如果我将它分配给变量并打印变量,我会得到一个列表:

    <generator object <genexpr> at longNumber>

我查看了如何使用发电机并发现它非常令人困惑。

任何想法? 干杯

1 个答案:

答案 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!