想象一下这段代码,它从当前目录生成一个文件大小列表。文件:
_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
)(我称之为标题中的交叉引用)的方法。
我现在想知道我是否只能看到明显的或者这种方法是否有效。
答案 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
)
答案 1 :(得分:0)
您可以使用以下结构:
_sizes = [ getsize(join(_base, _file)) for _base, _dirs, _files in os.walk('.') for _file in _files ]
请注意,您不需要将第一个循环放在[]
中,因为您可以在列表解析中使用嵌套的for
循环。