2016-06-29 19 views
2

Ich habe eine Liste mit einem Bündel von Daten im Format von: date, month, dataWie summiere ich bestimmte Teile einer Liste?

Ich würde alle Einträge mit dem gleichen Datum wie alle ihre Daten zusammenzufassen und die Ausgabe einfach mehr aktuell sein, Daten. Mit anderen Worten sieht die Daten so etwas wie dieses

[(1/1/2011, August, 5), (1/1/2011, July, 4), (1,1,2011, June, 1), (1/6/2011, December, 5)] 

Für dieses Beispiel habe ich die Ausgabe so sein wollen würde:

[(1/1/2011, 10), (1/6/2011, 5)] 

Wie würde ich mich über das tun dies? Ich weiß, dass dies eine for-Schleife beinhalten würde und wenn ein Datum ähnlich ist, würde es die Daten zusammenfassen. Aber ich bin ratlos, wie ich das anstellen soll.

Antwort

2

ein Wörterbuch Nutzen Sie die einzigartigen Termine zu halten:

dates = {} 
for (date, month, day) in your_list: 
    if date not in dates: 
     dates[date] = day 
    else 
     dates[date] += day 

Sie würden dann auf eine Liste gehen zurück, wenn Sie die Ausgabe als Sie angegeben haben wollte:

outlist = [] 
for (date, daycount) in dates.items(): 
    outlist.append((date, daycount)) 

That Wenn Sie Daten verwenden, ist es in der Regel sinnvoll, sie als Datetime-Objekte zu speichern. Operationen wie das Hinzufügen von Daten sind einfacher.

+2

In dieser ersten Schleife könnten Sie auch 'dates = collections.defaultdict (int)' und dann nur 'dates [date] + = day 'anstelle der' if-else' verwenden. – dwanderson

+0

Wie kann ich das nie wissen? darüber? –

+0

Für den zweiten Block von Code, vielleicht 'outlist = Liste (dates.items()) 'für Python 3.X oder' outlist = dates.items()' für Python 2.X? –

1

Finden Sie alle Termine in der Liste, und dann können Sie jede zählen ein:

dates = [('1/1/2011', 'August', 5), ('1/1/2011', 'July', 4), 
     ('1/1/2011', 'June', 1), ('1/6/2011', 'December', 5)] 

each_date = set(d[0] for d in dates) 

count_dates = [(d, sum(i[2] for i in dates if i[0] == d)) for d in each_date] 

print(count_dates) 
# -> [('1/6/2011', 5), ('1/1/2011', 10)] 
+0

Ihre Eingabe ist anders. –

+2

@RahulKP Die angegebene Eingabe wird nicht analysiert –

+0

@JaredGoguen überprüfen Sie die Eingabe mit Frage und die Antwort. –

1

Hier ist ein Einzeiler basierend auf itertools.groupby():

>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> dates = [('1/1/2011', 'August', 5), ('1/1/2011', 'July', 4), 
      ('1/1/2011', 'June', 1), ('1/6/2011', 'December', 5)] 
>>> [(date, sum(map(itemgetter(-1), group))) for (date, group) in groupby(dates, key=itemgetter(0))] 
[('1/1/2011', 10), ('1/6/2011', 5)] 

Beachten Sie, dass ich für diese Demo verwendet das gleiche wie in @ Alecrasmussen die Antwort, da die Daten von der OP nicht von Python interpretiert werden können.

+1

Ich bin ein einfacher Mann. Ich sehe 1 Liner, ich upvote –

Verwandte Themen