2015-06-21 77 views
11

我有一個Python字典對象,它看起來有點像這樣:計數出現

[{"house": 4, "sign": "Aquarius"}, 
{"house": 2, "sign": "Sagittarius"}, 
{"house": 8, "sign": "Gemini"}, 
{"house": 3, "sign": "Capricorn"}, 
{"house": 2, "sign": "Sagittarius"}, 
{"house": 3, "sign": "Capricorn"}, 
{"house": 10, "sign": "Leo"}, 
{"house": 4, "sign": "Aquarius"}, 
{"house": 10, "sign": "Leo"}, 
{"house": 1, "sign": "Scorpio"}] 

現在,每一個「符號」鍵,我想指望有多少次,每次值發生。

def predominant_sign(data): 
    signs = [k['sign'] for k in data if k.get('sign')] 
    print len(signs) 

然而,這將打印倍「符號」的號碼出現在詞典中,而不是得到的sign的值和計數的時間出現的特定值的數目。

例如,我想看到的輸出是:

Aquarius: 2 
Sagittarius: 2 
Gemini: 1 
... 

等。我應該改變什麼來獲得所需的輸出?

+0

你想要得到的結果是在任何特定的順序? – thefourtheye

+0

@thefourtheye,不是。任何訂單都沒問題。下面的兩個答案很快就完成了。 :) – Newtt

+1

另外,你有一個Python詞典列表:-) – thefourtheye

回答

9

使用collections.Counter及其most_common method

from collections import Counter 
def predominant_sign(data): 
    signs = Counter(k['sign'] for k in data if k.get('sign')) 
    for sign, count in signs.most_common(): 
     print(sign, count) 
3

您可以使用collections.Counter模塊,用一個簡單的發電機表達式,像這樣

>>> from collections import Counter 
>>> Counter(k['sign'] for k in data if k.get('sign')) 
Counter({'Sagittarius': 2, 'Capricorn': 2, 'Aquarius': 2, 'Leo': 2, 'Scorpio': 1, 'Gemini': 1}) 

這會給你它具有signs爲鍵,出現的值數的字典。


你可以做同樣的一個正常的字典,這樣

>>> result = {} 
>>> for k in data: 
...  if 'sign' in k: 
...   result[k['sign']] = result.get(k['sign'], 0) + 1 
>>> result 
{'Sagittarius': 2, 'Capricorn': 2, 'Aquarius': 2, 'Leo': 2, 'Scorpio': 1, 'Gemini': 1} 

dictionary.get方法,接受第二個參數,這將是要返回的默認值,如果關鍵是沒有找到在字典裏。所以,如果當前的符號不在result中,它將代替0