这里有一个有趣的。当我使用或生成器发现一些意外结果时,我实际上是在为另一个问题写答案。filter
我有一个文件路径列表:
paths = ['/directoryb/baba.txt', '/directorya/nigel.txt', '/directoryb/ralph.txt', '/directorya/jim.txt'
我在路径列表中创建了一组不同的目录:
from os.path import dirname
dirs = {dirname(path) for path in paths}
现在我想制作一个生成器列表(甚至是生成器的生成器),每个生成器都包含paths
同一目录中的元素。所以我这样做:
dirs_iter = [(path for path in paths if path.startswith(dir)) for dir in dirs]
跑完后我是不是很惊讶:
for dir_iter in dirs_iter:
for path in dir_iter:
print(path)
并获得以下内容:
/directorya/nigel.txt
/directorya/jim.txt
/directorya/nigel.txt
/directorya/jim.txt
这显然是错误的。然而,如果我使用以下句子:
# now I'm generating the lists instead of using generators
dirs_iter = [[path for path in paths if path.startswith(dir)] for dir in dirs]
打印循环显示预期的答案:
/directoryb/baba.txt
/directoryb/ralph.txt
/directorya/nigel.txt
/directorya/jim.txt
如果我使用filter
和/或map
代替生成器:
dirs_iter = map(lambda dir: filter(lambda path: path.startswith(dir), paths), dirs)
我也得到了错误的答案 编辑: /map
版本filter
确实有效。
这里发生了什么?