Python 检查字典中的多个键的存在性和值

Python 检查字典中的多个键的存在性和值,python,Python,仅当对象有两个具有给定值的键时,我才希望执行以下操作: tel = ... nam = ... for obj in listofobjs: for key, val in obj.items(): if (key == 'tel' and val == tel) and \ (key == 'nam' and val == name): # do something... 这将不起作用,因为键和值不能同时是两个值。您不需要

仅当对象有两个具有给定值的键时,我才希望执行以下操作:

tel = ...
nam = ...
for obj in listofobjs:
    for key, val in obj.items():
        if (key == 'tel' and val == tel) and \
           (key == 'nam' and val == name):
            # do something...

这将不起作用,因为键和值不能同时是两个值。

您不需要循环使用
.items()
来执行此操作

for obj in listofobjs:
    if (obj.get('tel', None) == tel) and (obj.get('nam', None) == nam):
只需使用获取密钥,这样,如果密钥不存在,就不会出现
KeyError

默认情况下,
.get
返回
None
,但我在这里指定它是为了强调使用不同默认值的能力。如果要使用
None
作为默认值,可以省略
.get
调用中的第二个参数


None
替换为您知道永远不会是
tel
nam
的有效值的值

或者,如果
块是安全的,您可以在
中提供所有字典访问:


这会比您需要的多进行两次字典查找。我们可以选择正确性而不是小的效率调整:)如果
tel
nam
返回的默认值相同,这将失败。get
并且键不在字典中。另一个注意事项是
。get
已返回默认值
None
,无需指定我正在使用
None
来突出显示默认值可以更改。@Alex我在回答中突出显示了为什么保留
None
@Alex“将None替换为您知道永远不会对tel或nam有效的值。”。“如果需要,可以创建sentinel对象,但大多数情况下,没有一个对象可以作为有效的默认值。”。这是做这件事的惯用方法。
for obj in listofobjs:
    if 'tel' in obj and 'nam' in obj and obj['tel']==tel and obj['nam']==nam:
        ...
 for obj in listofobjs:
    try:
        if obj['tel']==tel and obj['nam']==nam:
            ...
    except KeyError:
        pass