【发布时间】:2014-01-19 15:18:32
【问题描述】:
我有一个这样的“for循环”:
for dirctory in dirs:
for item in os.walk(dirctory):
for i in item[2]:
i = os.path.join(item[0], i)
if is_image(i):
images.append(i)
我尝试将其重写为列表推导,我尝试了这个:
images.extend(filter(is_image, [item[0]+i for i in item[2] for item in os.walk(dirctory)]))
它说 UnboundLocalError: local variable 'item' referenced before assignment
所以我尝试了这个:
images.extend(filter(is_image, [(item[0]+i for i in item[2]) for item in os.walk(dirctory)]))
它说 TypeError: coercing to Unicode: need string or buffer, generator found
我在 OS X 中使用 Python 2.7.4。
【问题讨论】:
-
不是python专家,但是上面代码对应的列表推导可能有点长而且难以阅读。它也有副作用,我认为你通常会避免在列表理解中这样做。 edit 啊 nvm,我看到你只打算对部分代码使用列表理解。哎呀。我会说它仍然有点长
-
为了清晰和可读性,我个人会将其保留为嵌套循环。
-
问问你自己为什么要将它作为列表理解?在我看来,如果很难阅读和理解列表理解不是你想要的。只是认为其他人需要理解这个列表理解......
-
代码中的一个缺陷 - 将所有组件作为单个项目降低了可读性。在类似情况下,变量的显式命名比晦涩的索引更好。
-
all_directories = chain(*map(os.walk, dirs))full_filenames = lambda root, dirs, files: map(lambda file: os.path.join(root, file), files)image_files = filter(is_image, starmap(full_filenames, all_directories)
标签: python python-2.7 for-loop list-comprehension