Sortieren von zwei Listen nach gleichen Sotiermechanismus ?

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.
Benutzeravatar
kaytec
User
Beiträge: 541
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Samstag 23. Juni 2007, 12:19

Danke Michael !

Nein du hast es schon richtig verstanden. Ich wollte nur aufzeigen, daß es verschiedene Möglichkeiten gibt. Die Plätze stecken ja auch schon in der Liste ohne Zahlen, doch würde ich die Liste mit "print" für den Benutzer des Spieles ausgeben, dann müsste ich sie auch wieder in Zahlenform darstellen.

z.B.: Lina hat 3 mal den 1 Platz belegt

Dein code habe ich probiert und der ist auch schon super - ich werde ihn noch für meine Zwecke umbauen.

gruss und dank frank
Benutzeravatar
kaytec
User
Beiträge: 541
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Sonntag 24. Juni 2007, 22:13

Die Lösung von Michael hat zwar funktioniert, doch ich habe sie nicht verstanden. Jetzt habe ich eine eigene Lösung gefunden und hoffe sie ist auch soweit ok.

Code: Alles auswählen

namen = ['Frankie', 'Merkel', 'PG', 'Lina']
gesamt_wertung = [['Frankie', 'Merkel', 'PG', 'Lina'],
                 ['Lina', 'Frankie', 'PG', 'Merkel'],
                 ['Merkel', 'Frankie', 'Lina', 'PG'],
                 ['Lina', 'Frankie', 'Merkel', 'PG']]

plaetze_gesamt_wertung = list()
platz_einzel_wertung = list()
zaehler = 1
for name in namen:
    for einzel_wertung in gesamt_wertung:
        for spieler in einzel_wertung:
            if name == spieler:
                platz_einzel_wertung.append(zaehler)
            zaehler += 1
        zaehler = 1
    plaetze_gesamt_wertung.append(sorted(platz_einzel_wertung))
    platz_einzel_wertung = list()
       
for name, platz in sorted(zip(namen,plaetze_gesamt_wertung), key=lambda x: x[1]):
    print str(zaehler) + ' Platz fuer ' + name
    print '--> Plaetzen in den Einzelspielen ' + '|'.join(str(i) for i in platz)
    zaehler += 1


gruss frank
BlackJack

Beitragvon BlackJack » Montag 25. Juni 2007, 09:57

Ist von der Laufzeit nicht so besonders schön, und auch komplizierter als es sein müsste. Die äussere Schleife über die Namen kann man loswerden und den `zaehler` sollte man nicht selbst verwalten, sondern mit `enumerate()` erzeugen.

Was bei Deinen Lösungen oft das Verständnis erschwert ist, dass Du zusammengehörige Informationen oft auf verschiedene Listen aufteilst und sie nur durch den Index in den verschiedenen Listen "verbunden" sind.

Code: Alles auswählen

def main():
    gesamt_wertung = [['Frankie', 'Merkel', 'PG', 'Lina'],
                      ['Lina', 'Frankie', 'PG', 'Merkel'],
                      ['Merkel', 'Frankie', 'Lina', 'PG'],
                      ['Lina', 'Frankie', 'Merkel', 'PG']]
    #
    # Abbildung von Namen auf eine Liste von Plätzen in den Einzelspielen.
    #
    name2plaetze = dict()
    for wertung in gesamt_wertung:
        for platz, spieler in enumerate(wertung):
            name2plaetze.setdefault(spieler, list()).append(platz + 1)
    #
    # Die Plätze der Einzelspiele sortieren.
    #
    for plaetze in name2plaetze.itervalues():
        plaetze.sort()
    #
    # Daraus eine sortierte Gesamtplazierung erstellen.  Die Eintraege
    # haben die Form ([<plaetze>,...], 'name').
    #
    plaetze_sortiert = sorted((plaetze, name)
                              for name, plaetze in name2plaetze.iteritems())
    #
    # Und ausgeben...
    #
    for gesamt_platz, (plaetze, name) in enumerate(plaetze_sortiert):
        print '%3d Platz fuer %s' % (gesamt_platz + 1, name)
        print '--> Plaetze in den Einzelspielen', '|'.join(map(str, plaetze))
Benutzeravatar
kaytec
User
Beiträge: 541
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Montag 25. Juni 2007, 22:31

Danke BlackJack!

Habe mir es mal angeschaut - du erzeugst ja eigentlich genauso eine Liste wie ich.

Code: Alles auswählen

plaetze_sortiert = sorted((plaetze, name)
                          for name, plaetze in name2plaetze.iteritems())

sorted(zip(namen,plaetze_gesamt_wertung), key=lambda x: x[1])



Die "Namensliste" lasse ich mir übergeben und du erzeugst sie mit Hilfe einer dict()

Den zaehler ersetzt du mit enumerate() - dies zählt die Liste mit dem Startwert 0 durch !?

map() ersetzt die for-schleife !?

Das deine Version besser ist nehme ich mal an, doch warum ist mir nicht wirklich klar ?

gruss und dank frank

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]