将嵌套的 for 循环转换为列表理解
Transform nested for-loops to list comprehension
我有以下代码:
files_to_upload = []
for file_name in ignore_list:
for file_path in files_not_in_Azure:
if file_name in file_path:
files_to_upload.append(file_path)
如何使用列表理解将其写在一行中?
您可以使用 itertools.product
执行以下操作:
from itertools import product
files_to_upload = [file_path for file_path, file_name in product(ignore_list, files_not_in_Azure) if file_name in file_path]
请注意,此处使用多个 for
子句会更加冗长。 (也有人认为是poor style。)
[
files_to_upload.append(file_path)
for file_paths in
[
[
file_path
for file_path
in files_not_in_Azure
if file_name in file_path
]
for file_name in ignore_list
]
for file_path in file_paths
]
但正如@BrokenBenchmark 所说,制作 one-liner 会降低其可读性。
如果这些是您确实要上传的文件,您的 ignore_list 也可能被错误命名。
至于复杂性,您应该考虑找到一种直接搜索文件名的方法,而不是使用模糊搜索遍历两个列表。类似于
ignore_set = set(ignore_list)
files_to_upload = filter(lambda filepath:os.path.basename(filepath) in ignore_set, files_not_in_Azure)
我有以下代码:
files_to_upload = []
for file_name in ignore_list:
for file_path in files_not_in_Azure:
if file_name in file_path:
files_to_upload.append(file_path)
如何使用列表理解将其写在一行中?
您可以使用 itertools.product
执行以下操作:
from itertools import product
files_to_upload = [file_path for file_path, file_name in product(ignore_list, files_not_in_Azure) if file_name in file_path]
请注意,此处使用多个 for
子句会更加冗长。 (也有人认为是poor style。)
[
files_to_upload.append(file_path)
for file_paths in
[
[
file_path
for file_path
in files_not_in_Azure
if file_name in file_path
]
for file_name in ignore_list
]
for file_path in file_paths
]
但正如@BrokenBenchmark 所说,制作 one-liner 会降低其可读性。
如果这些是您确实要上传的文件,您的 ignore_list 也可能被错误命名。
至于复杂性,您应该考虑找到一种直接搜索文件名的方法,而不是使用模糊搜索遍历两个列表。类似于
ignore_set = set(ignore_list)
files_to_upload = filter(lambda filepath:os.path.basename(filepath) in ignore_set, files_not_in_Azure)