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)的
中的括号只是可选分组。