List-Comprehension oder nicht?

Du hast eine Idee für ein Projekt?
Antworten
scandia
User
Beiträge: 3
Registriert: Donnerstag 19. Januar 2017, 20:12

Hallo und guten Tag
Hier ein Listen-Auszug aus meinem Turnier-Wertungsprogramm. Ich möchte dazu eine Zweitwertung (Rangliste) erstellen.
Ich habe vor, wenn möglich mittels comprehension, zu allen Werten des Sets die zugehörige Punktzahl (erste Spalte) für 'f' (zweite Spalte)
addieren. So im Sinn: 'f' hat die Gegner a,d und c - diese die Punktzahl 2.0, 0.0, und 2.0 und 'f' somit die Zweitwertung 4.0 - im Schach für Eingeweihte, die sogenannte Buchholzwertung.
Daten= [
[3.0, 'f', '2000', 2, 1, {'a', 'd', 'c'}, False, 0.0],
[2.0, 'a', '2000', 1, 2, {'f', 'b', 'e'}, False, 0.0],
[2.0, 'b', '2000', 2, 1, {'a', 'd', 'e'}, False, 0.0],
[2.0, 'c', '2000', 2, 1, {'f', 'd', 'e'}, False, 0.0],
[0.0, 'd', '2000', 1, 2, {'b', 'c', 'f'}, False, 0.0],
[0.0, 'e', '2000', 1, 2, {'a', 'b', 'c'}, False, 0.0]
]
Mit meinen anscheinend unzulänglichen Fähigkeiten und Kenntnissen (und schon eher als Anfänger) kriege ich das Ganze nicht hin und wäre froh um Tipps. Thanks!
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hallo scandia, willkommen im Forum!

Es ist etwas schwierig zu verstehen. Wenn ich das richtig sehe, hast du hier in deiner "Daten"-Liste mehrere Listen enthalten, jeweils mit Daten zu einem Schachspieler? "a" bis "f" sind dann die einzelnen Spieler, zusammen mit einigen zugehörigen Daten: Ihre Punktezahl, ihre bisherigen Gegner, usw. Das sieht sehr "magisch" aus. Mein Vorschlag wäre, dafür eine vernünftige Datenstruktur zu benutzen. Du kennst Listen und kannst sie verschachteln, hier würde ich vermutlich eher Dictionaries verschachteln, oder gar einige Klassen anlegen, falls du dich damit schon auskennen solltest. Dann werden Berechnungen hinten raus deutlich leichter und weniger Kopf zerbrechend :mrgreen:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@scandia: für Strukturierte Daten nimmt man keine Listen (ich meine die inneren Listen), sondern wie Kebap schon geschrieben hat, NamedTuples, Klassen oder Wörterbücher. Dann hat man keine magischen Indexwerte entry[2] ist der Name, sondern Namen: entry.name.
Die äußere Liste ist für Dein Problem auch nicht ideal, da Du ja zu einem Namen einen Eintrag suchst. Da wäre also ein Wörterbuch besser geeignet, und läßt sich auch leicht erzeugen:

Code: Alles auswählen

{entry.name:entry for entry in rangliste}
Nimmst Du statt dessen ein OrderedDict, hast Du beides in einem:

Code: Alles auswählen

OrderedDict((entry.name, entry) for entry in rangliste)
scandia
User
Beiträge: 3
Registriert: Donnerstag 19. Januar 2017, 20:12

Hallo und guten Tag
Ihr seid unglaublich rasch - thanks.
Werde versuchen eure Tipps um zu setzen - zuerst mal mit Dictionarys.
scandia
User
Beiträge: 3
Registriert: Donnerstag 19. Januar 2017, 20:12

Danke für die Nachfrage - hat nicht funktioniert. Ich halte allerdings meine unzulänglichen Fähigkeiten für den Grund und nicht die vorgeschlagenen Lösungsansätze. Grundsätzlich geht es um die Buchholzwertung im Schach und die verlangt, dass man die Punktzahlen der Gegnerschaft summiert - und anschliessend diese Summe dann als zusätzliches Sortierkriterium benutzt.
Damit aus obiger Tabelle die Werte gefunden und addiert werden, muss meiner Ansicht nach über der Tabelle iteriert werden - kriege ich nicht korrekt hin - ohne Iteration, sozusagen händisch, kann ich die Werte für die einzelnen Spieler (a,b,c) finden und addieren.
Iterieren kann ich nicht und mit Listcomprehension schon gar nicht - obwohl an sich sehr elegant und auch selbst erklärend.
Habe den Vorschlag soweit umgesetzt, dass ich final zwei Dictionaries besass - half nicht weiter.

Eventuell ist auch der Ansatz falsch, dass ich das ganze Unterfangen an der Schlusstabelle eines Turniers durchführen will. Ich sollte die Zweitwertung wohl eher in die einzelnen Scripts (Funktionen), also in die Berechnung der einzelnen Runden einbauen - eine zweite Zusatzwertung, die sogenannte Sonnenborn-Berger-Wertung dann gleich auch.

Eigentlich schade, da mein bisheriger Code und Ansatz verblüffend einfach und kurz ausgefallen ist - eher ungewöhnlich für das Schweizersystem (und für die Tatsache, dass er bisher fehlerlos funktionierte).

thanks
Antworten