これは面白いものです。またはジェネレーターを使用して予期しない結果を見つけたとき、実際に別の質問に対する回答を書いていました。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
and/orを使用する場合:map
dirs_iter = map(lambda dir: filter(lambda path: path.startswith(dir), paths), dirs)
私も間違った答えを得ます 編集: /map
バージョンfilter
は実際に機能します。
何が起きてる?