【问题标题】:Avoid nested loops using list-comprehension使用列表理解避免嵌套循环
【发布时间】:2018-06-20 19:28:31
【问题描述】:

我想知道在下面的情况下使用 List Comprehension 避免嵌套循环是否是个好主意

想象一下config.py 文件中的以下名称列表

# config.py
NAME_LIST = [
    'name1',
    'name2',
    (...)
]

我正在使用这个名称列表遍历多个不同的目录,对于我找到的每个文件,我都会读取文件的内容并处理数据。

这是我的实际代码:

import config

def foo():

    for w in config.NAME_LIST:
        folder = "/data/test/{name}/in".format(name=w)
        files = list_files(folder) # return a list of files found in folder

        for f in files:
            content = read_file(folder, f) # read files content
            # (... do some stuff to process data)

我真的很想避免嵌套循环以使代码尽可能平坦。

我尝试使用 List Comprehension 来解决此问题,但不确定这是最佳解决方案,因为我不希望它返回任何内容。

这是我所做的:

import config

def foo():

    def _process(f):
        """function called from list comprehension to avoid doing nested loops"""
        content = read_file(folder, f)  # read files content
        # (... do some stuff to process data)

    for w in config.NAME_LIST:
        folder = "/data/test/{name}/in".format(name=w)
        files = list_files(folder) # return a list of files found in folder
        [_process(f) for f in files] # using list comprehension 

列表理解在这种情况下是一个好的解决方案吗?有没有更好的方法来实现这一点?

【问题讨论】:

  • 不,这绝对是不是列表理解的用例。列表推导式用于创建列表,而不是作为 for 循环的“单行”替代品。您创建一个列表并立即丢弃它。只要坚持你的循环。

标签: python python-3.x loops nested list-comprehension


【解决方案1】:

有一些使用过滤器或任何方法来避免不必要的输出 (Is there a map without result in python?) 但 for 循环可能是最惯用的方法?你有什么理由想要它平坦吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2012-06-25
    • 2016-05-31
    • 2014-11-18
    相关资源
    最近更新 更多