【问题标题】:Check if a dictionary exists in list检查列表中是否存在字典
【发布时间】:2017-09-28 16:30:58
【问题描述】:

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

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')

它必须返回'Not exists',但它没有。

【问题讨论】:

  • 您的示例按我的预期工作...附带说明,不要将变量命名为 list,因为它是内置函数的名称
  • 不清楚您要做什么。 Python 使用由它们的类型定义的相等运算符检查列表中的每个项目与比较中的项目。如果它们是等价的,那么 in(成员资格)运算符将评估为 True,否则它将评估为 False。你声称这不是正在发生的事情。我建议您追溯您的步骤并确认您所看到的内容。
  • 我的代码有问题,谢谢@Jim
  • @JimDennis OP 描述的行为是正确的,因为它们创建了一个 new dict 对象
  • @Chris_rands 实际上他声称它没有返回他所期望的(错误)。但在我的建议回溯他的步骤后,他得到了它。实际上,这些字典的 id() 值并不重要。列表中的 in 运算符将全面检查相等性。我刚刚通过创建两个具有相同文字定义的字典对此进行了测试,它们都返回 True 以表示 in 我的列表。不同之处在于修改 dict1 将保持相等性,因为只有对它的引用存储在列表中(它们引用指向同一个对象)。

标签: python list python-3.x dictionary


【解决方案1】:

注意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 不等于新对象dict1。这就是为什么它不在列表中。如果您将其更改为dict1['key1'] = "other",则检查将是True
【解决方案2】:

您描述的行为是正确的,因为您在将其重新分配给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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 2019-02-13
    • 2011-04-23
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多