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