Причина в том, что iterable
выполняется с last
dirpath
, то есть a/b
.Не всегда itertools
всегда возвращает iterator
, он не будет выполнен, пока не будет повторен.
Таким образом, чтобы связать dirpath
с каждым iteration
в цикле for
, мыможно использовать простой function
как mapfunc
.Таким образом, результирующий код будет выглядеть так:
import itertools
import os
jpeg_paths = []
walk = [("a", ["a.jpg", "b.jpg"]), ("a/b", ["a.txt"])]
def mapfunc(filenames, dirpath=None): # `dirpath` will be associated with each function object
return map(lambda name: os.path.join(dirpath, name), filenames)
for dirpath, filenames in walk:
# select image files
jpg_filenames = filter(lambda name: name.endswith("jpg"), filenames)
# generate absolute path
#break
image_fullpath = mapfunc(jpg_filenames, dirpath=dirpath) # associate the `dirpath` to each `function` object
jpeg_paths = itertools.chain(jpeg_paths, image_fullpath)
print(list(jpeg_paths))
, или, возможно, исчерпывает iterator
на каждой итерации, например,
image_fullpath = tuple(map(lambda name: os.path.join(dirpath, name), jpg_filenames))
Таким образом, он будет ассоциировать dirpath
в этот момент.на jpg_filenames
звонок.Но это сохранит все objects
в memory
, и если вещь, которую вы хотите пройти, достаточно велика, это не очень хорошая идея:)