Python 检查同一行的2个字典中是否存在键
我有两本字典:Python 检查同一行的2个字典中是否存在键,python,dictionary,Python,Dictionary,我有两本字典: a = {'abc': 12} b = {'abcd': 13, 'abc': 99} 我想检查两个字典中是否都存在某个键。在这种情况下,我想检查a和c是否都包含键“abc” 我有以下代码: if 'abc' in a: if 'abc' in b: print(True) else: print(False) else: print(False) 以及: 但是有没有更好的方法呢 一个班轮:) 一行:) 不-这是非常好
a = {'abc': 12}
b = {'abcd': 13, 'abc': 99}
我想检查两个字典中是否都存在某个键。在这种情况下,我想检查a和c是否都包含键“abc”
我有以下代码:
if 'abc' in a:
if 'abc' in b:
print(True)
else:
print(False)
else:
print(False)
以及:
但是有没有更好的方法呢 一个班轮:)
一行:)
不-这是非常好的,因为它得到。。。对于正在发生的事情,它是可读且显而易见的: 如果
dict
s的数量增加:
all('abc' in d for d in (d1, d2, d3, d4))
或者,先进行预计算,然后访问:
common_keys = set(d1).intersection(d2, d2, d3, d4)
'abc' in common_keys
不-这是非常好的,因为它得到。。。对于正在发生的事情,它是可读且显而易见的: 如果
dict
s的数量增加:
all('abc' in d for d in (d1, d2, d3, d4))
或者,先进行预计算,然后访问:
common_keys = set(d1).intersection(d2, d2, d3, d4)
'abc' in common_keys
我认为解决办法是:
if ('abc' in a) and ('abc' in b):
print(True)
else:
print(False)
这是最好的、最具Python风格的方法。我认为解决方案:
if ('abc' in a) and ('abc' in b):
print(True)
else:
print(False)
这是最好的、最符合python的方法。如何使用列表理解将其推广到N个词典:
a = {'abc': 12}
b = {'abcd': 13, 'abc': 99}
c = {'abcd': 13, 'abc': 99, 'xyz': 1}
key = 'abc'
if any([key in d.keys() for d in [a,b,c]]):
print('key found in at least one dict')
elif all([key in d.keys() for d in [a,b,c]]):
print('key found in all dicts')
我花了一段时间才学会喜欢列表理解,但它们实际上只是“循环”的一行,而且速度也非常快 如何使用列表理解将词典归纳为N个:
a = {'abc': 12}
b = {'abcd': 13, 'abc': 99}
c = {'abcd': 13, 'abc': 99, 'xyz': 1}
key = 'abc'
if any([key in d.keys() for d in [a,b,c]]):
print('key found in at least one dict')
elif all([key in d.keys() for d in [a,b,c]]):
print('key found in all dicts')
我花了一段时间才学会喜欢列表理解,但它们实际上只是“循环”的一行,而且速度也非常快 对于一个关键的成员资格检查,这实际上是过分的。如果
a
和b
较大,则会产生O(M)(其中M是最小的密钥计数)成本,而密钥成员资格测试本身将是O(1)。最好是在a中使用“abc”,在b中使用“abc”,这样更简单、更快。如果你要做很多这样的测试,那么使用dict视图可能是一个优势,但对于这种简单的情况,你在这里浪费了CPU周期。如果“abc”在a
中不存在,那么处理b
就没有意义了。在我看来,这种交叉还为时过早。这样一来,您就失去了惰性评估的好处。对于一个关键的成员资格检查,这实际上是过火了。如果a
和b
较大,则会产生O(M)(其中M是最小的密钥计数)成本,而密钥成员资格测试本身将是O(1)。最好是在a中使用“abc”,在b中使用“abc”,这样更简单、更快。如果你要做很多这样的测试,那么使用dict视图可能是一个优势,但对于这种简单的情况,你在这里浪费了CPU周期。如果“abc”在a
中不存在,那么处理b
就没有意义了。在我看来,这种交叉还为时过早。这样就失去了惰性计算的好处。在Python2.x中,a.keys()+b.keys()
只会将两个列表串联在一起,这对检查中的'abr'不起作用。我不知道会出什么问题,除非它可能有重复的值……比如:k1=[1]
和k2=[2]
,然后k1+k2
是[1,2]
-所以,如果我们想看看1
是否在两者中,那么k3中的1
是真的,即使它不在两者中。。。。连接只会告诉你它是否在任何一个目录中…@zmo;如果a
有钥匙而b
没有怎么办?如果你把这些键加在一起,它将始终是真的,而期望的结果将是假的。对,大便发生了:-)删除了错误的答案。谢谢你指出这一点。(我不明白为什么我会时不时地说出这样愚蠢的事情……而这正是我在实际代码中从未犯过的错误)。在Python2.x中,a.keys()+b.keys()
只会将两个列表串联在一起,这对于检查中的'abr'是不正确的,除了它可能有重复的值之外…比如说:k1=[1]
和k2=[2]
,那么k1+k2
就是[1,2]
-所以,如果我们想看看1
是否在两者中,那么k3中的1
是真的,即使它不在两者中。。。。连接只会告诉你它是否在任何一个目录中…@zmo;如果a
有钥匙而b
没有怎么办?如果你把这些键加在一起,它将始终是真的,而期望的结果将是假的。对,大便发生了:-)删除了错误的答案。谢谢你指出这一点。(我不明白为什么我会时不时地说出这样愚蠢的事情……而这正是我在实际代码中从未犯过的错误)。我认为,第二种错误对性能有负面影响。如果在a
中不存在“abc”,则处理b
是没有意义的。在我看来,这种交叉还为时过早。这样就失去了惰性评估的好处。@ElmoVanKielmo取决于操作的频率,如果d1
始终是“主要”命令,我认为第二个命令会对性能产生负面影响。如果在a
中不存在“abc”,则处理b
是没有意义的。在我看来,这种交叉还为时过早。这样就失去了延迟求值的好处。@ElmoVanKielmo取决于操作的频率,如果d1
始终是“主要”命令。。。