Python 中可以有 'cross-referencing' 个生成器吗?

can there be 'cross-referencing' generators in Python?

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

_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('.')] 不是正确的生成器语法。我现在需要的是一种从列表 (_files) 中遍历 sub-element 同时引用另一个列表 (_base) 的方法(我在标题中称之为 cross-referencing) .

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

你可以这样做:

_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

您可以使用以下结构:

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

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