用逗号列出理解语法

list comprehensions syntax with comma

你能解释一下这段代码吗

[y for _, y in ((1,2),(3,4))]

输出是 [2, 4]

我没有找到使用此语法的文档,但可以 运行。

[y for _, y in ((1,2),(3,4))]List Comprehension.

这相当于下面for:

In [2935]: l = []

In [2936]: for _, y in ((1,2),(3,4)):
      ...:     l.append(y)
      ...: 
      ...: 

In [2937]: l
Out[2937]: [2, 4]

另外 _ 是一个 throw-away 变量,这意味着您在迭代时使用的变量,但实际上并没有将它们用于任何其他目的。

如果您分解短语 ((1,2),(3,4)),您最终会得到两个 tupletuple

所以迭代遍历外部 tuple,获取 _ 中的第一项和 y 中的第二项,从中你只获取第二个变量,y,并创建一个新的 list.

这个和这个代码一样,首先比较容易掌握:

my_set = ((1,2), (3,4))
my_list = []
for _, y in myset:
    my_list.append(y)

您可以有效地将代码扩展为

t = ((1,2),(3,4))
print([y for x, y in t])

在这里,用 _ 替换 x 返回原来的一行

print([item for item in (("id", 1), ("name", "Yao Yuan"))])
# Output: [('id', 1), ('name', 'Yao Yuan')]
print([(item[0], item[1]) for item in (("id", 1), ("name", "Yao Yuan"))])
# Output: [('id', 1), ('name', 'Yao Yuan')]
print([(key, value) for key, value in (("id", 1), ("name", "Yao Yuan"))])
# Output: [('id', 1), ('name', 'Yao Yuan')]
print([key for key, value in (("id", 1), ("name", "Yao Yuan"))])
# Output: ['id', 'name']
print([value for key, value in (("id", 1), ("name", "Yao Yuan"))])
# Output: [1, 'Yao Yuan']

如果我将代码转换为

[y for             x,y in ((1,2),(3,4))]

很容易理解 _ 等于 x

,在第二个语句中

带逗号 x1, x2, ...., xn = (y1, y2, ...., yn) 的语法用于将长度为 n 的可迭代对象解压缩为 n 个单独的变量。解包iterable时使用的undescore是说你不关心你正在解包的iterable的某个索引中的值。

所以基本上,您的示例使用的是列表理解,其中您首先将可迭代 ((1,2),(3,4)) 中的每个索引解压缩到变量 _, y 中(其中 _ 表示忽略索引 0),然后您理解所有y 变量放入列表 = [2, 4]

[y for _, y in ((1,2),(3,4))]