@pythy: Die Kommentare sind teilweise unpassend oder überflüssig. Bei ``# define…`` steht ja schon im Code, dass dort Funktionen definiert werden und wie die heissen. ``# dictionary`` ist falsch, weil dort überhaupt kein Wörterbuch definiert wird.
`dict` ist der Name des eingebauten Datentyps, den sollte man nicht an andere Werte binden, denn dann kann man das Objekt nicht mehr aufrufen oder anderweitig verwenden.
Alternativ mit weniger selbst geschriebenen Funktionen und mehr aus der Standardbibliothek (ungetestet):
Code: Alles auswählen
from itertools import imap
from operator import itemgetter
from collections import defaultdict
def main():
#
# ...
#
month2temperatures = defaultdict(list)
for month, temperature in imap(itemgetter([5, 0]), rows):
month2temperatures[month].append(float(temperature))
month2average_temperature = dict(
(m, sum(ts) / len(ts)) for m, ts in month2temperatures.iteritems()
)
if __name__ == '__main__':
main()
Und die Idee keine Listen aufzubauen, sondern einen Aggregator-Datentyp zu schreiben (ungetestet):
Code: Alles auswählen
from itertools import imap
from operator import itemgetter
from collections import defaultdict
class Averager(object):
def __init__(self, value=0.0, count=0):
self.sum = value
self.count = count
def __iadd__(self, value):
self.sum += value
self.count += 1
return self
@property
def average(self):
return self.sum / self.count
def main():
#
# ...
#
month2temperatures_averager = defaultdict(Averager)
for month, temperature in imap(itemgetter([5, 0]), rows):
month2temperatures_averager[month] += float(temperature)
for month, aggregate in sorted(month2temperatures_averager.iteritems()):
print 'Average temperature in {0} was {1:.2f}.'.format(
month, aggregate.average
)
if __name__ == '__main__':
main()