将嵌套的 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)