需要帮助理解 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}")

我想确保我理解语法:

  1. 我对 sorted() 函数有基本的了解,但我从未见过它以 (sorted(x for x in os.listdir(path)) 的方式使用。有人可以解释一下“for x in x”在这里完成了什么吗?

  2. 同样,在定义image_files时,似乎[i]和x都用于循环遍历一个范围。每个不同的语法背后有什么含义吗?

  1. 这是 sorted() 函数内部的一个生成器表达式,它接受一个可迭代对象。 sorted(x for x in iterable) 本身与 sorted(iterable) 相同;它分开的唯一原因是 if 语句正在过滤 iterable

    的值
  2. 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
]