我正在编写一个教程,但找不到适用于以下问题的答案: 我有一个嵌套在List中的Dictionary,想要计算特殊键的出现次数,例如“Date”出现两次:
test = [{'Category': 'a', 'Num': '1', 'Day': 'Tuesday', 'Date': '2013'}, {'Category': 'b', 'Num': '1', 'Day': 'Monday', 'Date': '2013'}]
作为我得到的解决方案:
from collections import Counter
counter = Counter(item["Date"] for item in test)
print counter
这似乎在教程中有用(虽然我仍然不理解它100%)但我想尝试自己编写代码。我提出了各种解决方案,但没有一个工作我的基础或多或少(只是为了表明我想做什么,我知道它不起作用):
counter = 0
for x in test:
if x == "Date":
counter+=1
print counter
答案 0 :(得分:5)
有时正确命名变量将有助于我们更好地理解要解决的问题。
要检查字典中是否存在特定键,您可以使用in
运算符,如下所示
counter = 0
for current_dict in test:
if "Date" in current_dict:
counter += 1
print counter
你可以用列表理解来编写相同的逻辑,就像这样
sum([1 for current_dict in test if "Date" in current_dict])
在这段代码中,我们将循环和条件设置为平,生成的实际值为1.如果打印此
[1 for current_dict in test if "Date" in current_dict]
您将看到1
与字典列表中Date
出现的次数一样多print True == 1 # will print True
print False == 0 # will print True
。然后使用sum
函数,我们只是添加整个列表。
这可以进一步缩短。让我们看看如何做到这一点。在python中,布尔值实际上是整数的子类。所以,在Python中
sum(["Date" in current_dict for current_dict in test])
我们可以利用这个优势,比如
if
这里我们刚刚删除了True
条件,相反,对于列表中的字典,我们只是累积一个布尔值(一个整数)。如果Date
中有current_dict
,则布尔值为False
(1),如果不存在,则会给出print ["Date" in current_dict for current_dict in test]
(0)。您只需打印即可确认
sum
你会得到一系列的0和1。我们只是将它们与{{1}}一起添加以获得结果。