0

これは面白いものです。またはジェネレーターを使用して予期しない結果を見つけたとき、実際に別の質問に対する回答を書いていました。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

ジェネレーターの代わりにfilterand/orを使用する場合:map

dirs_iter = map(lambda dir: filter(lambda path: path.startswith(dir), paths), dirs)

私も間違った答えを得ます 編集: /mapバージョンfilterは実際に機能します。

何が起きてる?

4

1 に答える 1