[英]python KeyError if key not in b.keys()
我想比较两个字典键,如果有匹配项,我想用键和两个字典中的值创建一个新的字典,如果没有匹配项,我想将值设为 0。
我尝试了下面的代码,但是当我尝试打印不在第一个 dict a
中的这个键时,我得到了KeyError: 't2.large'
。
c = dict()
a = {'m3.xlarge': 4, 't2.medium': 1, 't2.large': 1, 'm3.large': 1}
b = {'m3.xlarge': 5, 't2.medium': 1, 'm3.large': 2, 'm4.large': 1}
c = dict()
for key, value in a.items():
if key in b.keys():
a_key = key
a_value = value
b_value = b[key]
c.setdefault(a_key,[]).append(a_value)
c.setdefault(a_key,[]).append(b_value)
elif key not in b.keys():
value = b.get(key)
print("key not in b.keys() => ", value) # key not in b.keys() => None
b_value = b[key]
print("key a not in b.keys => ", b_value) # KeyError: 't2.large'
print(c)
结果应该是这样的:
# c = {'m3.xlarge': [4, 5], 't2.medium': [1, 1], 't2.large': [1, 0], 'm3.large': [1, 2], 'm4.large': [0, 1]}
我的第二个问题,如果两个字典中的 key:value 之间存在匹配,我如何做同样的事情但不将 key:value 附加到新字典。
't2.medium': [1, 1] will be removed because the keys:values are the same 1-1
c = {'m3.xlarge': [4, 5], 't2.large': [1, 0], 'm3.large': [1, 2], 'm4.large': [0, 1]}
谢谢!
你的代码效率很低。 错误从这里发生:
elif key not in b.keys():
#...
b_value = b[key]
在这里,您知道key
不是b
的元素,但您仍对其进行查询。
尽管如此,一个优雅的单线将是:
c = {key:[val,b.get(key,0)] for key,val in a.items()}
这将替换您编写的所有代码。 但是,根据您的示例输出,您可能需要将其替换为:
c = {key:[val,b.get(key,0)] for key,val in a.items()}
c.update({key:[a.get(key,0),val] for key,val in b.items()})
甚至更优雅:
c = {key:[a.get(key,0),b.get(key,0)] for key in set(a)|set(b)}
在终端中运行它时,我得到:
$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = {'m3.xlarge': 4, 't2.medium': 1, 't2.large': 1, 'm3.large': 1}
>>> b = {'m3.xlarge': 5, 't2.medium': 1, 'm3.large': 2, 'm4.large': 1}
>>> c = {key:[val,b.get(key,0)] for key,val in a.items()}
>>> c.update({key:[a.get(key,0),val] for key,val in b.items()})
>>> c
{'t2.medium': [1, 1], 'm3.xlarge': [4, 5], 'm3.large': [1, 2], 'm4.large': [0, 1], 't2.large': [1, 0]}
>>> c = {key:[a.get(key,0),b.get(key,0)] for key in set(a)|set(b)}
>>> c
{'t2.medium': [1, 1], 'm3.xlarge': [4, 5], 't2.large': [1, 0], 'm3.large': [1, 2], 'm4.large': [0, 1]}
(2) : 要回答你的第二个问题,你可以添加一个过滤器:
c = {key:[a.get(key,0),b.get(key,0)] for key in set(a)|set(b) if a.get(key,0) != b.get(key,0)}
如果您正在使用两个字典中的键查找列表,您可以使用:
a = {'m3.xlarge': 4, 't2.medium': 1, 't2.large': 1, 'm3.large': 1}
b = {'m3.xlarge': 5, 't2.medium': 1, 'm3.large': 2, 'm4.large': 1}
c = dict()
for key in set(a.keys() | b.keys()):
c[key] = [a.get(key, 0), b.get(key, 0)]
导致
{'t2.medium': [1, 1], 't2.large': [1, 0], 'm3.large': [1, 2], 'm4.large': [0, 1], 'm3.xlarge': [4, 5]}
我们可以合并第二个标准(虽然不是特别优雅)并简化为一行,如下所示:
c = {key: [a.get(key, 0), b.get(key, 0)] for key in set(a.keys() | b.keys()) if a.get(key, 0) != b.get(key, 0)}
注意:在 Python 2.7 中,您需要使用a.keys() + b.keys()
而不是a.keys() | b.keys()
a.keys() | b.keys()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.