检查列表中是否存在字典

22

我有一个包含一些字典的列表:

dict1 = {
'key1': 'value1',
'key2': 'value2',
}

dict2 = {
'key1': 'value3',
'key2': 'value4',
}

list = [dict1, dict2]

我正在使用这个方法来检查列表中是否存在字典,例如我将dict1更改为以下内容:

我用这种方法检查列表中是否有字典,例如我把dict1改成了这个:

dict1 = {
'key1': 'something',
'key2': 'value2',
}

现在,检查dict1

if dict1 in list:
    print('Exists')
else:
    print('Not exists')

它应该返回'Not exists',但它没有。


5
你的示例对我来说符合预期... 另外一点,不要将变量命名为list,因为它是一个内置函数的名称。 - Railslide
不清楚你想做什么。Python会使用各个类型定义的相等运算符,逐个比较列表中的每一项与你进行比较的项。如果它们是等价的,那么in(成员)运算符将返回True,否则返回False。你声称情况并非如此。我建议你重新追溯你的步骤,并确认你所看到的内容。 - Jim Dennis
无论如何感谢@Railslide。 - thoongnv
2
@Chris_rands 实际上,他声称它没有返回他期望的结果(False)。但是,在我的建议下,经过重新追踪他的步骤后,他解决了这个问题。实际上,这些字典的 id() 值并不重要。列表上的 in 运算符将对整个列表进行相等性检查。我刚刚通过创建两个具有相同文字定义的字典来测试了这一点,它们都在我的列表中返回 True。区别在于修改 dict1 将保持相等性,因为列表中只存储了对它的引用(这些引用指向同一个对象)。 - Jim Dennis
@Railslide 确实,我可能错误地解释了问题,但我认为现在我们都明白了,谢谢。 - Chris_Rands
显示剩余5条评论
2个回答

18

请注意,list是一个内置函数,应使用不同的名称,例如my_list

它将返回如下所示的False

>>> dict1
{'key2': 'value2', 'key1': 'value1'}
>>> my_list = [dict1, dict2]
>>> dict1 in my_list
True
>>> dict1 = {
... 'key1': 'something',
... 'key2': 'value2',
... }
>>> dict1 in my_list
False

1
你在这里重新分配了dict变量。因此,原始对象dict1不等于新对象dict1。这就是为什么它不在列表中的原因。如果你像这样改变它dict1['key1'] = "other",检查将会是True - Michael P

7

您所描述的行为是正确的,因为当您将其重新分配给dict1而不是修改现有的dict时,会创建一个新的dict,您可以通过跟踪dict1的标识来看到这一点:

>>> dict1 = {
... 'key1': 'value1',
... 'key2': 'value2',
... }
>>> 
>>> dict2 = {
... 'key1': 'value3',
... 'key2': 'value4',
... }
>>> 
>>> list = [dict1, dict2]
>>> dict1 in list
True
>>> id(dict1)
140141510806024
>>> dict1['newkey'] = 'value' # modify the dict
>>> id(dict1)
140141510806024 # the id has not changed
>>> dict1 in list
True
>>> dict1 = {
... 'key1': 'something',
... 'key2': 'value2',
... }
>>> id(dict1)
140141510059144 # the id has changed
>>> dict1 in list
False

请注意不要使用变量名list,因为它将掩盖内置的list()函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接