【问题标题】:can there be 'cross-referencing' generators in Python? [duplicate]Python中可以有“交叉引用”生成器吗? [复制]
【发布时间】:2015-06-25 08:24:39
【问题描述】:

想象一下下面这段代码,它从当前目录的文件中生成文件大小列表:

_sizes = []
for _base, _dirs, _files in os.walk('.'):
    for _file in _files:
        _size = getsize(join(_base, _file))
        _sizes.append(_size)

我想知道我是否可以从这个-s.th 创建一个嵌套生成器。喜欢:

_sizes = [getsize(join(_base, _file)) 
              for _file in _files 
                  for [_base, _dirs, _files in os.walk('.')]]

这当然在语法上是不正确的,因为[_base, _dirs, _files in os.walk('.')] 不是正确的生成器语法。我现在需要的是一种在引用另一个子元素 (_base) 的同时迭代列表 (_files) 中的子元素的方法(我在标题中称之为交叉引用)。

我现在想知道我是否只是看不到明显的东西,或者这种方法是否普遍无效。

【问题讨论】:

    标签: python syntax generator


    【解决方案1】:

    你可以这样做:

    _sizes = [
        getsize(join(_base, _file))
        for _base, _dirs, _files in os.walk('.')
        for _file in _files
    ]
    

    如果您想要生成器,请使用生成器表达式(将 [] 替换为 ()):

    _sizes = (
        getsize(join(_base, _file))
        for _base, _dirs, _files in os.walk('.')
        for _file in _files
    )
    

    list comprehension in Python tutorial

    【讨论】:

      【解决方案2】:

      您可以使用以下结构:

      _sizes = [ getsize(join(_base, _file)) for _base, _dirs, _files in os.walk('.') for _file in _files ]
      

      请注意,您不需要将第一个循环放在 [] 中,因为您可以在列表理解中使用嵌套的 for 循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-05
        • 2018-02-18
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 2015-01-23
        相关资源
        最近更新 更多