Seite 1 von 2

Verfasst: Freitag 30. Mai 2008, 16:18
von audax
Braucht Python2.5, sry :D

Man könnte auch den itemgetter durch lambdas ersetzen...oder updaten. ;)

Verfasst: Freitag 30. Mai 2008, 16:22
von mazman
hmm. es muss irgendwie mit 2.4 gehen...

Verfasst: Freitag 30. Mai 2008, 16:25
von audax
Ich sag doch: Nimm halt lambda.

Code: Alles auswählen

from itertools import groupby, imap
from operator import itemgetter

a = [(5224,"2005"),(5524,"2003"),(1524,"2005"),(554,"2008"),(5824,"2005"),(524,"2008")]

s = sorted((int(year), area) for area, year in a)

data = {}
for k, g in groupby(s, itemgetter(0)):
    data[k] = sum(imap(itemgetter(1), g))

years = sorted(data.keys())
max_area = sorted(data.iteritems(),
        key=lambda elem: (elem[1], elem[0])
        )[-1][0] # max and year

for year, text in [
        (years[0], "earliest %d: %d"),
        (years[-1], "oldest %d: %d"),
        (max_area, "biggest area %d: %d")]:
    print text % (year, data[year])
         
print "full area: %d" % sum(data.itervalues())

Verfasst: Freitag 30. Mai 2008, 16:26
von mazman
danke!!!

werde mich mal mit dem lamda vertraut machen... :-)

Verfasst: Freitag 30. Mai 2008, 16:28
von audax
Och..brauch man eigentlich eher selten.
Das meiste ist im Modul operator enthalten :]

Verfasst: Freitag 30. Mai 2008, 16:47
von mazman
wie bekomme ich bei der funktion das return der werte hin? mir fehlt noch die area_jung (1078) und die area_alt (5524) und area_gross (12572)?

das print ist nicht so wichtig. ich brauche nur die werte als return.

Code: Alles auswählen

from itertools import groupby, imap
from operator import itemgetter

a = [(5224,"2005"),(5524,"2003"),(1524,"2005"),(554,"2008"),(5824,"2005"),(524,"2008")]

def datum_area(table):
    s = sorted((int(year), area) for area, year in table)
    
    data = {}
    for k, g in groupby(s, itemgetter(0)):
        data[k] = sum(imap(itemgetter(1), g))
    
    years = sorted(data.keys())
    max_area = sorted(data.iteritems(),
            key=lambda elem: (elem[1], elem[0])
            )[-1][0] # max and year
    
    for year, text in [
            (years[0], "earliest %d: %d"),
            (years[-1], "oldest %d: %d"),
            (max_area, "biggest area %d: %d")]:
        print text % (year, data[year])
    alt = years[0]
    #area_alt = ?
    gross =  years[1]
    #area_gross = ?
    jung = years[2]
    #area_jung = ?

    area_full = sum(data.itervalues())
    return area_full, alt, area_alt, gross, area_gross, jung, area_jung

Verfasst: Freitag 30. Mai 2008, 17:05
von audax

Code: Alles auswählen

from itertools import groupby, imap
from operator import itemgetter

a = [(5224,"2005"),(5524,"2003"),(1524,"2005"),(554,"2008"),(5824,"2005"),(524,"2008")]

def datum_area(table):
    s = sorted((int(year), area) for area, year in table)
    
    data = {}
    for k, g in groupby(s, itemgetter(0)):
        data[k] = sum(imap(itemgetter(1), g))
    
    years = sorted(data.keys())
    max_area = sorted(data.iteritems(),
            key=lambda elem: (elem[1], elem[0])
            )[-1][0] # max and year
    

    results = {}
    keys = "total earliest oldest biggest".split()
    t, e, o, b = keys
    for year, key in [
            (years[0], e),
            (years[-1], o),
            (max_area, b)]:
        results[key] =  (year, data[year])

    results[t] = sum(data.itervalues())
    return [results[k] for k in keys] 

print datum_area(a)
Ich will dir ja nicht zu nahe treten, aber...kannst du überhaupt Python?

€dit:
Oder so:

Code: Alles auswählen

from itertools import groupby, imap, izip
from operator import itemgetter

a = [(5224,"2005"),(5524,"2003"),(1524,"2005"),(554,"2008"),(5824,"2005"),(524,"2008")]

def datum_area(table):
    s = sorted((int(year), area) for area, year in table)
    
    data = {}
    for k, g in groupby(s, itemgetter(0)):
        data[k] = sum(imap(itemgetter(1), g))
    
    years = sorted(data.keys())
    max_area = sorted(data.iteritems(),
            key=lambda elem: (elem[1], elem[0])
            )[-1][0] # max and year
    

    results = {}
    keys = "total earliest oldest biggest".split()
    for year, key in izip(
            [ years[0], years[-1], max_area], 
            keys[1:]):
        results[key] =  (year, data[year])

    results[keys[0]] = sum(data.itervalues())
    return [results[k] for k in keys] 

print datum_area(a)

Verfasst: Freitag 30. Mai 2008, 17:24
von mazman
bin voll der anfänger...

trotzdem danke nochmal