Python 词典理解中for循环的in关键字是如何工作的?
我有以下代码片段:Python 词典理解中for循环的in关键字是如何工作的?,python,dictionary,dictionary-comprehension,Python,Dictionary,Dictionary Comprehension,我有以下代码片段: d = {1:2, 3:4, 5:6} d1 = {k*2:v/2 for (k,v) in d.items()} d2 = {k*2:v/2 for [k,v] in d.items()} d3 = {k*2:v/2 for [k,v] in d.items() if [k,v] in d.items()} print(d1) print(d2) print(d3) 这将产生以下输出: {2: 1.0, 6: 2.0, 10: 3.0} {2: 1.0, 6: 2.0,
d = {1:2, 3:4, 5:6}
d1 = {k*2:v/2 for (k,v) in d.items()}
d2 = {k*2:v/2 for [k,v] in d.items()}
d3 = {k*2:v/2 for [k,v] in d.items() if [k,v] in d.items()}
print(d1)
print(d2)
print(d3)
这将产生以下输出:
{2: 1.0, 6: 2.0, 10: 3.0}
{2: 1.0, 6: 2.0, 10: 3.0}
{}
字典对d1
的理解是有意义的,因为它检查d.items()
中形式为(k,v)
的元组,这是元组的“种类”列表
d2
的字典理解应该返回{}
,因为[k,v]
列表不在d.items()
中,这在d3
的字典理解中得到验证
在
for
循环中的与在循环外部使用它之间有什么区别?正如您所发现的,d.items()中的(k,v)的:与dict comprehensions()中的[k,v]的:相同
您可能有兴趣了解以下代码:
d4 = {k*2:v/2 for [k,v] in d.items() if (k,v) in d.items()}
print(d4)
生成输出:
{2: 1.0, 6: 2.0, 10: 3.0}
因为d.items()中的(k,v)是True
不同之处在于[k,v]
是两个元素的列表,它从不在d中。items()
总是返回一个视图,其中元素只有元组,其中(k,v)
就是一个例子。正如您所发现的,d.items()中(k,v)的:与d.items()中[k,v]的:相同()
在听写理解中
您可能有兴趣了解以下代码:
d4 = {k*2:v/2 for [k,v] in d.items() if (k,v) in d.items()}
print(d4)
生成输出:
{2: 1.0, 6: 2.0, 10: 3.0}
因为d.items()中的(k,v)是True
不同之处在于,[k,v]
是两个元素的列表,它从不在d中。items()
总是返回一个视图,其中元素只有元组,其中(k,v)
就是一个例子。
中的作为布尔运算符在d3
的每次迭代中返回False
,因为元组和数组总是不同的:
print(("foo") == ["foo"]) # False
print(("foo") == ("foo")) # True
print(["foo"] in [("foo")]) # False
print(["foo"] in [["foo"]]) # True
当在
中使用作为迭代器时,它将输出键值的元组,当在…
中键入[k,v]时,每次迭代将把键值和值解压为u,v,但d.items()
是一个元组数组,将其元素与数组进行比较将始终返回False
中的作为布尔运算符,在d3
的每次迭代中返回False
,因为元组和数组总是不同的:
print(("foo") == ["foo"]) # False
print(("foo") == ("foo")) # True
print(["foo"] in [("foo")]) # False
print(["foo"] in [["foo"]]) # True
当在
中使用作为迭代器时,它将输出键值的元组,当在…
中键入[k,v]时,每次迭代将把键值和值解压为u,v,但d.items()
是一个元组数组,将其元素与数组进行比较总是会从文档中返回False
,对于表达式列表中的目标列表
在每次迭代中将对象从表达式列表
分配到目标列表
。就像正则语句中的列表分配分配值一样
>>> [x,y] = 100, 200
>>> x
100
>>> y
200
for[k,v]in d.items()
将d.items()
迭代的元组值赋给x
和y
。因此,{k*2:v/2 for(k,v)in d.items()}
和{k*2:v/2 for[k,v]in d.items()
是相同的
在你的最后一个案例中
d3 = {k*2:v/2 for [k,v] in d.items() if [k,v] in d.items()}
d3
为空的原因是列表[k,v]
不在迭代元组的d.items()
中。但是元组k,v
为空。更改复选框,然后再次获得完整的词典
>>> d4 = {k*2:v/2 for [k,v] in d.items() if (k,v) in d.items()}
>>> d4
{2: 1.0, 6: 2.0, 10: 3.0}
关于列表赋值的最后一句话,我很惊讶这不是语法错误。事实上,当你赋值时,你得到的是一个元组而不是列表。我很困惑
>>> z = [x,y] = (100,200)
>>> z
(100, 200)
从文档中,表达式列表中的目标列表
在每次迭代中将对象从表达式列表
分配到目标列表
。就像常规语句中的列表分配分配值一样
>>> [x,y] = 100, 200
>>> x
100
>>> y
200
for[k,v]in d.items()
将d.items()
迭代的元组值赋给x
和y
。因此,{k*2:v/2 for(k,v)in d.items()}
和{k*2:v/2 for[k,v]in d.items()
是相同的
在你的最后一个案例中
d3 = {k*2:v/2 for [k,v] in d.items() if [k,v] in d.items()}
d3
为空的原因是列表[k,v]
不在迭代元组的d.items()
中。但是元组k,v
为空。更改复选框,然后再次获得完整的词典
>>> d4 = {k*2:v/2 for [k,v] in d.items() if (k,v) in d.items()}
>>> d4
{2: 1.0, 6: 2.0, 10: 3.0}
关于列表赋值的最后一句话,我很惊讶这不是语法错误。事实上,当你赋值时,你得到的是一个元组而不是列表。我很困惑
>>> z = [x,y] = (100,200)
>>> z
(100, 200)
in
关键字作为for…in…
构造的一部分,与它作为运算符的使用完全无关。它们只是碰巧共享同一个关键字。仅此而已。for(k,v)in d.items()
在理解中的工作方式与for循环中的工作方式相同,如果[k,v]in d.items()中
在理解上的工作方式与它在单独的if
语句中的工作方式相同。作为for…in…
构造的一部分的in
关键字与其作为运算符的使用完全无关。它们只是碰巧共享同一个关键字。仅此而已。for(k,v)in d.items()
在理解中的工作方式与在for循环中的工作方式相同,并且在d.items()中的if[k,v]
在理解上的工作方式与它在单独的if
语句中的工作方式相同。@Mayankmital-是的,它只是解包,我个人很惊讶它能与列表语法一起工作。括号用于分组,而方括号不用于分组。我总是假设中的括号用于d.items()中的(k,v)
只是可选的分组。@MayankMittal-是的,它只是解包,我个人很惊讶它能与列表语法一起工作。括号用于分组,而方括号不用于分组。我总是假设d.items()中(k,v)的中的括号只是可选分组。