如何在Python中查询字典中的字典值?

5

我有一个在 Python 中的列表,它是包含字典的字典。

{'METTS MARK': {'salary': 365788, 'po': 1}, 'HARRY POTTER':{'salary': 3233233, 'po': 0}

我该如何计算符合 'po' = 1 的记录数量?

我尝试了以下代码:

sum = 0
for key, values in DIC:
     if values[po] == 1:
        sum = sum + 1

但是它返回: too many values to unpack 提前致谢。

使用 DIC.items() 获取 keyvalue - Peter Wood
2个回答

8
您可以简单地使用sum并在条件上求和:
total = sum(values.get('po') == 1 for values in DIC.values())

这相当于(正如@VPfB所说):

total = sum (1 for item in DIC.values() if item.get('po') == 1)

但后者效率稍低。

你应该使用'po'而不是po, 因为它是一个字符串, 你最好使用.get('po'),因为这样可以确保它在每个字典中都起作用,即使'po'不是每个字典的一部分。

我认为你忘记在你的for循环中使用.items()了。通过对字典进行迭代,你迭代,在这种情况下,你无法将你的键展开成两个元素的元组。

然而,使用生成器,这将更加高效(可能更快),而且代码很简洁。此外,直接迭代.values而不是.items(),预计性能会提高,因为可以节省打包和解包的时间。


你应该使用.get('po', 0)。在你的版本中,由于None的存在,你会遇到异常。而且sum()函数在处理列表时比处理生成器更快。因此最好使用sum([values.get('po', 0) == 1 for values in DIC.values()])。 - Oleksandr Dashkov
@OleksandrDashkov:但是由于键不存在,将返回None,而None == 1将生成False(因此计为零)。可能values['po']2,您不想将其计算两次,而是要消除这些。 - Willem Van Onsem
@OleksandrDashkov:None 不能与 1 进行比较,None == False 会失败。此外,如果 OP 改变主意想要使用 0 而不是 1 进行过滤,这将使代码更加健壮。 - Willem Van Onsem
你可能更喜欢使用sum (1 for item in DIC.values() if item.get('po') == 1)来提高可读性。这只是个人偏好的问题。 - VPfB
@VPfB:这确实更易读,但效率稍低。此外,这是一个众所周知的模式。不过,为了参考,我会将其添加到答案中。 - Willem Van Onsem

2

你可以像这样获取它:

a = {
     'METTS MARK': {'salary': 365788, 'po': 1},
     'HARRY POTTER': {'salary': 3233233, 'po': 0}
     }

print(len([b for b in a.values() if b.get('po')==1]))

输出:

1

在这里,我们正在创建一个字典列表,其中键 po==1。然后我们计算列表的长度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接