字典理解中for循环的in关键字如何工作?

How does the in keyword of for loop in dictionary comprehensions work?

我有以下代码片段:

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 的字典理解应该 return {} 因为列表 [k,v] 不存在于 d.items() 中,这在 [= 的字典理解中得到验证=19=].

infor循环内部和在外部使用有什么区别?

如您所见,for (k,v) in d.items() 与字典理解中的 for [k,v] in d.items() 相同。

您可能有兴趣知道这段代码:

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}

因为 True(k,v) in d.items()

不同之处在于 [k,v] 是一个包含两个元素的列表 neverd.items() 中总是 returns 带有元素的视图只有 tuples,其中 (k,v) 是一个例子。

in 作为布尔运算符 return Falsed3 的每次迭代中,因为元组和数组总是不同的:

print(("foo") == ["foo"]) # False
print(("foo") == ("foo")) # True
print(["foo"] in [("foo")]) # False
print(["foo"] in [["foo"]]) # True

当使用in作为迭代器时,它会输出key-value的元组,当键入[k,v] in ... 时,每次迭代都会将key和value解压成u,v,但是d.items()是一个元组数组,将其元素与数组进行比较总是 return False

for statement 文档中,for target_list in expression_list 在每次迭代中将对象从 expression_list 分配到 target_list。就像常规语句中的列表赋值一样赋值

>>> [x,y] = 100, 200
>>> x
100
>>> y
200

for [k,v] in d.items()d.items()迭代的元组值赋值给xy。结果,{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 为空的原因是 list [k,v] 不在 d.items() 中,它迭代元组。但是 tuple 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)