2015-06-21 21 views
11

Ho un oggetto dizionario Python che sembra un po 'come questo:occorrenze conteggio di ogni chiave nel dizionario 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"}] 

Ora, per ogni tasto 'segno', mi piacerebbe contare quante volte si verifica ogni valore .

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

Questo, tuttavia, stampe Numero di volte 'segno' compare nel dizionario, invece di ottenere il valore della sign e contando il numero di volte in cui compare un particolare valore.

Ad esempio, l'output mi piacerebbe vedere è:

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

E così via. Cosa dovrei cambiare per ottenere l'output desiderato?

+0

si desidera che il risultato sia in alcun ordine particolare? – thefourtheye

+0

@thefourtheye, non proprio. Qualsiasi ordine va bene Le due risposte seguenti hanno fatto il trucco in poco tempo. :) – Newtt

+1

Inoltre, hai una lista di dizionari Python :-) – thefourtheye

risposta

9

Usa collections.Counter e la sua 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

È possibile utilizzare il modulo collections.Counter, con un semplice generatore di espressione, come questo

>>> 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}) 

Questo vi darà un dizionario che ha la signs come chiavi e il loro numero di occorrenze come valori.


Si può fare lo stesso con un dizionario normale, come questo

>>> 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} 

Il metodo dictionary.get, accetta un secondo parametro, che sarà il valore di default da restituire se la chiave non si trova nel dizionario Quindi, se il segno attuale non è in result, restituirà invece 0.

Problemi correlati