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
)
您可以使用以下结构:
_sizes = [ getsize(join(_base, _file)) for _base, _dirs, _files in os.walk('.') for _file in _files ]
请注意,您不需要将第一个循环放在 []
中,因为您可以在列表理解中使用嵌套的 for
循环。
想象下面的一段代码,它从当前目录的文件中生成一个文件大小列表:
_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
)
您可以使用以下结构:
_sizes = [ getsize(join(_base, _file)) for _base, _dirs, _files in os.walk('.') for _file in _files ]
请注意,您不需要将第一个循环放在 []
中,因为您可以在列表理解中使用嵌套的 for
循环。