Python 检查列表中是否存在词典

Python 检查列表中是否存在词典,python,list,python-3.x,dictionary,Python,List,Python 3.x,Dictionary,我有一份清单,其中包含一些格言: dict1 = { 'key1': 'value1', 'key2': 'value2', } dict2 = { 'key1': 'value3', 'key2': 'value4', } list = [dict1, dict2] 我用它来检查列表中是否存在dict,例如我将dict1更改为这个 dict1 = { 'key1': 'something', 'key2': 'value2', } 现在,检查dict1 if dict1 in list

我有一份清单,其中包含一些格言:

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

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

list = [dict1, dict2]
我用它来检查列表中是否存在dict,例如我将
dict1
更改为这个

dict1 = {
'key1': 'something',
'key2': 'value2',
}
现在,检查
dict1

if dict1 in list:
    print('Exists')
else:
    print('Not exists')
它必须返回
“不存在”
,但它没有返回

注意
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

您描述的行为是正确的,因为当您将新的
dict
重新分配给
dict1
而不是修改现有的
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()

您的示例对我来说很有用。。。另一方面,不要将变量命名为
列表
,因为它是一个内置函数的名称,不清楚您想做什么。Python使用由类型定义的相等运算符,对照比较中的项目检查列表中的每个项目。如果它们相等,则in(成员资格)运算符将计算为True,否则将计算为False。你在说这不是正在发生的事。我建议你回溯你的步骤,确认你看到了什么。我的代码有点错误,谢谢@Jim@JimDennisOP描述的行为是正确的,因为它们创建了一个新的
dict
object@Chris_rands实际上,他声称它没有返回他所期望的(错误)。但在我的建议下,他又重新考虑了一下,终于明白了。实际上,这些字典的id()值并不重要。列表上的in运算符将检查整个板的相等性。我刚刚通过创建两个具有相同文字定义的词典来测试这一点,它们都返回True,因为它们在我的列表中。不同之处在于,修改dict1将保持相等,因为列表中只存储对它的引用(它们引用的是同一个对象)。您可以在此处重新分配dict变量。因此,原始对象
dict1
不等于新对象
dict1
。这就是为什么它不在清单上。如果您像
dict1['key1']=“other”
那样更改它,检查结果将是
True