繁体   English   中英

python KeyError 如果密钥不在 b.keys() 中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM