2017-01-15 209 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