2017-08-07 1 views
0

zu machen habe ich eine Liste der Wörterbücher, die wie folgt aussieht:ein neues Wörterbuch mit Zählungen

[{'year_month': '2017-07', 'issue_priority': 'high', 'issue_number': 2153}, 
{'year_month': '2017-07', 'issue_priority': 'normal', 'issue_number': 2179}, 
{'year_month': '2017-07', 'issue_priority': 'low', 'issue_number': 2169}, 
{'year_month': '2017-06', 'issue_priority': 'blocker', 'issue_number': 1998}] 

Was tut Ich mag würde, ist, dass die Liste der Wörterbücher zu nehmen und es in ein Wörterbuch mit dem folgenden machen:

{'2017-07': {'high': count of issue_numbers, 'low': count of issue_numbers}, 
'2017-06': {'high': count of issue_numbers, 'low': count of issue_numbers}, ...} 

ich bin gerade zurück in Python bekommen und haben so etwas wie dies nie zuvor so getan, was ich nicht wirklich wissen, wo sie suchen müssen.

Ich weiß, wie man über die Liste iteriert, aber ich bin nicht wirklich sicher, wie man dahin kommt, wohin ich gehen möchte.

Ich habe folgende, die dort einen Teil des Weges bekommen hat, freue mich jetzt nur, wie man die Zählung der Ausgabe Zahlen zu erhalten:

output = {} 
for item in issues # issues being my list of dictionaries: 
    month = item.pop('year_month') 
    output[month] = item 
+0

Wenn es mehr sind ' 'issue_priority'' s, möchtest du diese zum Ergebnis hinzufügen? –

+0

@WillemVanOnsem ja, das wäre was ich suche – DarthOpto

Antwort

2

Eine Möglichkeit wäre, Ihre ursprüngliche Liste iterieren von Fragen und die Zählung in Ihrem Ergebnis erhöhen manuell:

def sort_by_priority(issues): 
    result = {} 
    for issue in issues: 
     priority = issue['issue_priority'] 
     month = result.setdefault(issue['year_month'], {}) 
     month[priority] = month.get(priority, 0) + 1 
    return result 
1

Diese sieht wie etwas, das schön mit einem Counter, nur der inneren Wörterbücher funktionieren soll Zähler sein. Sie müssen einige zusätzliche Schritte ausführen, um zuerst nach Datum zu sortieren.

Sie müssen das Wörterbuch nach year_month teilen. Dann müssen Sie für dieses Jahr aller issue_priority Arten zählen und Monat:

from collections import Counter 

dates = set(issue['year_month'] for issue in issues) 
output = {} 
for ym in dates: 
    subset = [issue for issue in issues if issue['year_month'] == ym] 
    output[ym] = Counter(issue['issue_priority'] for issue in subset) 

Viele der oben genannten Schritte können auf eine kleinere Zeilenzahl reduziert dargestellt werden, aber auf Kosten der Klarheit und Lesbarkeit in meiner Meinung. Davon abgesehen:

dates = set(issue['year_month'] for issue in issues) 
output = {ym: Counter(issue['issue_priority'] for issue in issues if issue['year_month'] == ym) for ym in dates} 

Der Ausgang beider Verfahren ist

{'2017-06': Counter({'blocker': 1}), 
'2017-07': Counter({'high': 1, 'low': 1, 'normal': 1})} 

Counter ist nur ein etwas schickere dict, so können Sie es als ususal zugreifen. Um Probleme mit fehlenden Prioritätsarten zu vermeiden, verwenden Sie einfach die get Methode anstelle der direkten Indizierung:

output['2017-06']['high'] 

einen Fehler erhöhen, so tun Sie stattdessen:

output['2017-06'].get('high', 0) 
+0

Vielen Dank, während Ihre Antwort auch funktioniert. Ich wählte die andere Antwort, da ich keine weitere Bibliothek hinzufügen musste und nicht über ein anderes Counter-Wörterbuch iterieren musste. – DarthOpto

+0

@DartOpto. Ich denke, Sie haben aus den richtigen Gründen die richtige Wahl getroffen. Ein Upvote wäre aber nett. :) –

+0

Danke, und haben ein upvote. – DarthOpto

Verwandte Themen