【问题标题】:using a sub-string to identify file names in python在python中使用子字符串来识别文件名
【发布时间】:2016-02-08 04:14:00
【问题描述】:

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

我正在使用:

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

当我运行此脚本时,文件会以正确的顺序打印。但是,除了打印之外,我无法将此声明的产品用于任何其他用途。 如果我将它分配给一个变量并打印该变量,我会得到一个列表:

    <generator object <genexpr> at longNumber>

我查阅了如何使用生成器,发现它非常混乱。

有什么想法吗? 干杯

【问题讨论】:

    标签: list file python-3.x


    【解决方案1】:

    我怀疑你在某处得到了生成器对象,因为当你想使用列表推导时,你正在使用生成器表达式。

    列表解析类似于[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!
    

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多