用逗号列出理解语法
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))
,您最终会得到两个 tuple
的 tuple
。
所以迭代遍历外部 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))]
你能解释一下这段代码吗
[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))
,您最终会得到两个 tuple
的 tuple
。
所以迭代遍历外部 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))]