다음은 재미 있습니다. 실제로 another question에 대한 답변을 작성한 후 filter
또는 생성기를 사용하여 예기치 않은 결과를 발견했습니다.필터 또는 생성기로 예기치 않은 결과가 발생했습니다.
from os.path import dirname
dirs = {dirname(path) for path in paths}
그리고 지금은 발전기의 목록 (또는 심지어 발전기를 만들고 싶어 :
paths = ['/directoryb/baba.txt', '/directorya/nigel.txt', '/directoryb/ralph.txt', '/directorya/jim.txt'
내가 경로 목록의 다른 디렉토리의 집합을 만들 : 나는 파일 경로의 목록을 가지고 생성자), 각 요소는 동일한 디렉토리에 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
. 나는 다음과 같은 문장을 사용하는 경우 그리고 아직 : 나는 발전기 대신 filter
및/또는 map
를 사용하는 경우
/directoryb/baba.txt
/directoryb/ralph.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]
인쇄 루프는 예상 답을 보여줍니다
dirs_iter = map(lambda dir: filter(lambda path: path.startswith(dir), paths), dirs)
잘못된 대답을 너무 많이받습니다편집 :map
/filter
버전이 실제로 작동합니다.
여기 무슨 일 이니?