nach Datum sortieren und jüngstes zurückgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Freitag 30. Mai 2008, 16:18

Braucht Python2.5, sry :D

Man könnte auch den itemgetter durch lambdas ersetzen...oder updaten. ;)
mazman
User
Beiträge: 22
Registriert: Mittwoch 12. März 2008, 15:39

Beitragvon mazman » Freitag 30. Mai 2008, 16:22

hmm. es muss irgendwie mit 2.4 gehen...
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Freitag 30. Mai 2008, 16:25

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())
mazman
User
Beiträge: 22
Registriert: Mittwoch 12. März 2008, 15:39

Beitragvon mazman » Freitag 30. Mai 2008, 16:26

danke!!!

werde mich mal mit dem lamda vertraut machen... :-)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Freitag 30. Mai 2008, 16:28

Och..brauch man eigentlich eher selten.
Das meiste ist im Modul operator enthalten :]
mazman
User
Beiträge: 22
Registriert: Mittwoch 12. März 2008, 15:39

Beitragvon mazman » Freitag 30. Mai 2008, 16:47

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Freitag 30. Mai 2008, 17:05

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)
mazman
User
Beiträge: 22
Registriert: Mittwoch 12. März 2008, 15:39

Beitragvon mazman » Freitag 30. Mai 2008, 17:24

bin voll der anfänger...

trotzdem danke nochmal

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder