循环遍历嵌套列表字典以计算键出现次数

时间:2014-01-19 12:34:29

标签: python list dictionary counter

我正在编写一个教程,但找不到适用于以下问题的答案: 我有一个嵌套在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

1 个答案:

答案 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}}一起添加以获得结果。