2017-01-15 32 views
-2

我使用DictReader来读取一个csv文件。Python:词典的列表。计算基于字典键的元素

我的词典列表:

如:

a = [{'Name':'A','Class':'1'},{'Name':'B','Class':'1'},{'Name':'C','Class':'2'}] 

我想指望有“类” == 1

是它在列表中的条目数可能做到没有循环?

编辑:

我曾尝试以下:

count = 0 
for k in a: 
    if k['Class'] == '1': 
     count += 1 
print(count) 
+0

It lo像你希望我们为你写一些代码。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。展示这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出以及实际获得的输出(输出,回溯等)。您提供的细节越多,您可能会收到的答案就越多。检查[FAQ](http://stackoverflow.com/tour)和[如何提问](http://stackoverflow.com/questions/how-to-ask)。 – TigerhawkT3

回答

2

使用sumgenerator expression

>>> xs = [{'Name':'A','Class':'1'}, 
      {'Name':'B','Class':'1'}, 
      {'Name':'C','Class':'2'}] 
>>> sum(x.get('Class') == '1' for x in xs) 
2 
+0

@DYZ当钥匙不存在而不是提升错误时,将返回无。 – MYGz

+0

@MYGz,使用'dict.get'是为了防止'KeyError'。 – falsetru

+0

我知道。 DYZ在问这个问题。 – MYGz

2

肯定的:

a = [{'Name':'A','Class':'1'},{'Name':'B','Class':'1'},{'Name':'C','Class':'2'}] 
print(len(filter(lambda x: x.get('Class')=='1' , a))) 

Ø本安输出:

2 
1

这是很旧的方式方法来解决问题,但如果你想用for循环做,在这种方式,你可以试试这个。

a = [{'Name':'A','Class':'1'},{'Name':'B','Class':'1'},{'Name':'C','Class':'2'}] 

cnt = 0 
for k in a: 
    if k['Class'] == '1': 
     cnt += 1 
print(cnt) 

输出

2 
1

使用列表理解为好,字典检索符合您的条件,然后计算其len

>>> len([d for d in a if d.get('Class')=='1']) 
2 

编辑:Python3.5.2下时序档案

>>>import timeit 
>>> 
>>> timeit.timeit(stmt="len([d for d in a if d.get('Class')=='1'])", globals={'a':a}) 
0.8056499021768104 
>>> 
>>> timeit.timeit(stmt="sum(x.get('Class') == '1' for x in a)", globals={'a':a}) 
0.9977147589670494 
>>> 
>>> timeit.timeit(stmt="len(list(filter(lambda x: x.get('Class')=='1' , a)))", globals={'a':a}) 
1.3259506113099633