需要帮助理解 sorted(x for x in os.listdir(path)) 表达式
Need help understanding sorted(x for x in os.listdir(path)) expression
我正在设置一个 densenet 并遵循基于 PyTorch 的教程。代码的早期部分确定了教程图像的保存位置,如下所示:
class_names = sorted(x for x in os.listdir(data_directory)
if os.path.isdir(os.path.join(data_directory, x)))
num_class = len(class_names)
image_files = [
[
os.path.join(data_directory, class_names[i], x)
for x in os.listdir(os.path.join(data_directory, class_names[i]))
]
for i in range(num_class)
]
num_each = [len(image_files[i]) for i in range(num_class)]
image_files_list = []
image_class = []
for i in range(num_class):
image_files_list.extend(image_files[i])
image_class.extend([i] * num_each[i])
num_total = len(image_class)
image_width, image_height = PIL.Image.open(image_files_list[0]).size
print(f"Total image count: {num_total}")
print(f"Image dimensions: {image_width} x {image_height}")
print(f"Label names: {class_names}")
print(f"Label counts: {num_each}")
我想确保我理解语法:
我对 sorted() 函数有基本的了解,但我从未见过它以 (sorted(x for x in os.listdir(path)) 的方式使用。有人可以解释一下“for x in x”在这里完成了什么吗?
同样,在定义image_files时,似乎[i]和x都用于循环遍历一个范围。每个不同的语法背后有什么含义吗?
这是 sorted() 函数内部的一个生成器表达式,它接受一个可迭代对象。 sorted(x for x in iterable)
本身与 sorted(iterable)
相同;它分开的唯一原因是 if
语句正在过滤 iterable
的值
i
是范围元素(一个int),[i]
用于索引列表; x
是一个目录。 x
仅在内部方括号内的范围内。 image_files
将是列表的列表,长度为 num_class
那个变量也可以写成
image_files = [
[
os.path.join(data_directory, c, x)
for x in os.listdir(os.path.join(data_directory, c))
]
for c in class_names
]
我正在设置一个 densenet 并遵循基于 PyTorch 的教程。代码的早期部分确定了教程图像的保存位置,如下所示:
class_names = sorted(x for x in os.listdir(data_directory)
if os.path.isdir(os.path.join(data_directory, x)))
num_class = len(class_names)
image_files = [
[
os.path.join(data_directory, class_names[i], x)
for x in os.listdir(os.path.join(data_directory, class_names[i]))
]
for i in range(num_class)
]
num_each = [len(image_files[i]) for i in range(num_class)]
image_files_list = []
image_class = []
for i in range(num_class):
image_files_list.extend(image_files[i])
image_class.extend([i] * num_each[i])
num_total = len(image_class)
image_width, image_height = PIL.Image.open(image_files_list[0]).size
print(f"Total image count: {num_total}")
print(f"Image dimensions: {image_width} x {image_height}")
print(f"Label names: {class_names}")
print(f"Label counts: {num_each}")
我想确保我理解语法:
我对 sorted() 函数有基本的了解,但我从未见过它以 (sorted(x for x in os.listdir(path)) 的方式使用。有人可以解释一下“for x in x”在这里完成了什么吗?
同样,在定义image_files时,似乎[i]和x都用于循环遍历一个范围。每个不同的语法背后有什么含义吗?
这是 sorted() 函数内部的一个生成器表达式,它接受一个可迭代对象。
的值sorted(x for x in iterable)
本身与sorted(iterable)
相同;它分开的唯一原因是if
语句正在过滤 iterablei
是范围元素(一个int),[i]
用于索引列表;x
是一个目录。x
仅在内部方括号内的范围内。image_files
将是列表的列表,长度为num_class
那个变量也可以写成
image_files = [
[
os.path.join(data_directory, c, x)
for x in os.listdir(os.path.join(data_directory, c))
]
for c in class_names
]