试图避免嵌套的 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)]
如何去除代码中的这些嵌套 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)]