我有 2 个 for 循环,我想让它变得更好,比如列表理解或 lambda 或其他。我怎样才能做到这一点?
例如 :
filename = ['a.txt', 'b.txt', 'c.txt']
for files in filename:
for f in glob.glob(os.path.join(source_path, files)):
print f
... some processing...
你的代码完全没有问题。您只能通过引入不必要的复杂结构来使其不那么清晰。
我会像下面那样做。原因是现在您可以将搜索模式的形成、搜索和文件处理分开。如果它们不相关,则更容易扩展。
如果您的系统有点奇怪(例如分布式网络驱动器),那么带有 glob 和 os.path.join 的行是一条讨厌的行。尽管正如其他人所提到的,两个循环是完全可以的。
filename = ['a.txt', 'b.txt', 'c.txt']
searchPatterns = [os.path.join(source_path, files) for files in filename]
searchResults = [glob.glob(pattern) for pattern in searchPatterns]
fileListFlat = sum(searchResults,[])
for file in fileListFlat:
print file
您可以将两个for
循环压缩成一个生成器表达式*,并使用一个新for
循环从中提取文件名。
for f in (f_ for files in filename
for f_ in glob.glob(os.path.join(source_path, files))):
print f
# ...
正如另一个答案所说,这不是更好,这更糟,你不应该使用它(我不确定这是否足够强调!)。很难理解发生了什么,并且可能几乎没有性能优势(事实上,额外的间接层意味着它可能会更慢)。
(* 基本上等同于列表推导,但在这种情况下更好。)
当您必须向右扫描并向后四舍五入时,很难阅读冗长的表达。当有许多局部变量、lambdas 和 comprehensions 时,情况更糟,只是用括号和逗号分隔,只有几行。仅当您的代码不会变得更长和更复杂时才使用它们。
对于你的情况,我更喜欢提取find
作为权衡。但正如最佳答案所说,您的代码已经足够好了。
from itertools import chain
find = lambda p: glob.glob(os.path.join(source_path, p))
for file in chain(map(find, filename)):
"""
=) I like one-level indentation here.
=( I don't know which file pattern is used currently,
unless I use longer expression...
"""