试图避免嵌套的 for 循环

Trying to avoid nested for loops

如何去除代码中的这些嵌套 for 循环?我曾尝试使用列表理解,但没有创造出任何好的东西。谢谢您的帮助!这是我的部分代码:

    folders = [i for i in range(1, int(number_of_folders) + 1)]
    subfolders = [i for i in range(1, int(number_of_subfolders) + 1)]
    files = [i for i in range(1, int(number_of_files) + 1)]        

    for i in folders:
        folderpath = path + "/folder-" + str(i)

        for j in subfolders:
            subfolderpath = folderpath + "/subfolder-" + str(j)
            os.makedirs(subfolderpath)

            for k in files:
                file_path = subfolderpath + "/files-" + str(j) + '-' + str(k) + ".txt"
                open(file_path, "w")

首先你可以减少每个循环中的代码并整理 os.path.join:

for i in folders:
        for j in subfolders:
            subfolder_path = os.path.join(path, f"folder{i}", f"subfolder{j}")
            os.makedirs(subfolder_path)
            for k in files:
                file_path = os.path.join(subfolderpath, "files-{j}-{k}.txt")
                open(file_path, "w")

然后前 2 个循环可以变成 1 itertools.product:

import itertools

for i,j in itertools.product(folders, subfolders):
    subfolder_path = os.path.join(path, f"folder{i}", f"subfolder{j}")
    os.makedirs(subfolder_path)
    for k in files:
         file_path = os.path.join(subfolderpath, "files-{j}-{k}.txt")
         open(file_path, "w")

但是如果文件路径不存在,如何创建一个函数来创建文件路径呢?然后我们可以压缩成一个 for 循环。

def open_and_create(folder_path, file_name, *a):
    os.makedirs(folder_path, exist_ok=True)
    return open(os.path.join(folder_path, file_name) *a)

for i,j,k in itertools.product(folders, subfolders, files):
    subfolder_path = os.path.join(path, f"folder{i}", f"subfolder{j}")
    open_and_create(subfolder_path, "files-{j}-{k}.txt", 'w')

以下代码使用 list comprehensions 形成所有子文件夹和文件名,并且:

all_subfolders_list = [f"{path}/folder-{str(i)}/subfolder-{str(j)}/"
                  for i in range(1, int(number_of_folders) + 1)
                  for j in range(1, int(number_of_subfolders) + 1)]

all_filenames = [f"{subfolder_path}{k}" for subfolder_path in all_subfolders_list
                 for k in range(1, int(number_of_files) + 1)]

for subfolderpath in all_subfolders_list:
    os.makedirs(subfolderpath)

for file_path in all_filenames:
    open(file_path, "w")

我不确定您为什么要修改代码以使用列表理解,因为它相当清晰和高效。但是,直接 将您的代码转换为使用列表理解将是:

import os

number_of_folders = 2
number_of_subfolders = 3
number_of_files = 4

path = 'path'

def create_dir_and_file(file_path, file_name):
      os.makdedirs(file_path, exist_ok=True)
      open(file_name, "w")

[create_dir_and_file(f'{path}/folder-{i}/subfolder{j}', f'files{j}-{k}.txt')
      for i in range(1, int(number_of_folders) + 1)
      for j in range(1, int(number_of_subfolders) + 1)
      for k in range(1, int(number_of_files) + 1)]