字典理解中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=].
in
在for
循环内部和在外部使用有什么区别?
如您所见,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]
是一个包含两个元素的列表 never 在 d.items()
中总是 returns 带有元素的视图只有 tuple
s,其中 (k,v)
是一个例子。
in
作为布尔运算符 return False
在 d3
的每次迭代中,因为元组和数组总是不同的:
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()
迭代的元组值赋值给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
为空的原因是 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)
我有以下代码片段:
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=].
in
在for
循环内部和在外部使用有什么区别?
如您所见,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]
是一个包含两个元素的列表 never 在 d.items()
中总是 returns 带有元素的视图只有 tuple
s,其中 (k,v)
是一个例子。
in
作为布尔运算符 return False
在 d3
的每次迭代中,因为元组和数组总是不同的:
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()
迭代的元组值赋值给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
为空的原因是 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)