是否可以进行交叉引用' Python中的生成器?

时间:2015-06-25 08:24:39

标签: python syntax generator

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

_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)同时引用另一个子元素(_base)(我称之为标题中的交叉引用)的方法。

我现在想知道我是否只能看到明显的或者这种方法是否有效。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用以下结构:

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

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