Vergleichen von Listen

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.
Antworten
epicpython
User
Beiträge: 20
Registriert: Montag 1. Oktober 2018, 12:35

Ich bemühe mich derzeit ein Programm zu schreiben, welches die Werte von Items in einem Spiel vergleicht. Diese Items sind Listen, welche verschiedenste Eigenschaften besitzen. Der Vergleich vollzieht sich jeweils innerhalb der übergeordneten Kategorien. Bedingung für die Zuordnung zu einer Kategorie ist die Vergleichbarkeit mit den enthaltenen Items. Die Frage, die ich mir nun stelle, ist folgende: Wie vergleiche ich Listen so, dass die Ausgabe aufzeigt, welches der verglichenen Items den höchsten Wert je vergleichbarem Objekt besitzt? Hierzu, so denke ich, wäre sicher eine "for"-Schleife notwendig. Doch es scheint mir viel sinnvoller, deshalb frage ich, dass es eine Funktion zum Vergleichen der Werte innerhalb der Listen gibt. Schließlich soll das Programm die Vergleiche selbst vornehmen, ohne dass ich die Berechnungen einzeln definiere. Ich denke dabei etwa an eine Funktion, die zwei Werte des gleichen Stamms miteinander vergleicht und ausgibt, in welchem Verhältnis diese zueinander stehen (==, <, >, etc.).
epicpython
User
Beiträge: 20
Registriert: Montag 1. Oktober 2018, 12:35

Bei zwei geordneten Listen sollte es möglich sein, mit zwei "for"-Schleifen die Werte in ihrer Reihenfolge zu vergleichen ohne die Objekte einzeln angeben zu müssen. Doch ich vermisse eine eingebaute "compare()"-Funktion, welche die Werte zweier "for"-Schleifen während ihres Durchlaufs vergleicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich habe so gar nicht verstanden was Du da machen willst. Einzig beim letzten Satz des ersten Beitrags musste ich spontan an die `cmp()`-Funktion in Python 2 denken. Die wurde in Python 3 aber abgeschafft.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
epicpython
User
Beiträge: 20
Registriert: Montag 1. Oktober 2018, 12:35

Meine Überlegung ist, dass zwei vorab unabhängige "for"-Schleifen je Liste kreiert werden. Diese Schleifen enthalten keine Anweisungen (geht das? Wenn nicht, warum nicht?). Die "for"-Schleifen werden dann schließlich in einer Funktion verglichen. Die Funktion enthält alle möglichen Wertverhältnisse (geprüft mit "if-Statements" und anschließendem "break" gefolgt von der Ausgabe des Verhältnisses (>,<,==,..)).
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@epicpython: ``for``-Schleifen müssen mindestens eine ``pass``-Anweisung enthalten. Dann sind sie aber ziemlich sinnlos, ausser man braucht wirklich nur den Effekt das ein Iterator ”verbraucht” wird. Schleifen kann man nicht miteinander vergleichen. Das ist ja Code und keine Daten. Mir ist wie gesagt aus der Beschreibung immer noch nicht klar welches Problem da eigentlich gelöst werden soll.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@epicpython: kannst Du mal ein Beispiel geben, was der Input ist, und wie der Output aussehen soll? Aus dem langen Text werde ich nicht wirklich schlau.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn ich es richtig verstanden habe, dann wird sorted() gesucht. Dieses hat einen key-Parameter, dem man die gewünschte Operation für den Vergleich als Funktion mitgeben kann.
epicpython
User
Beiträge: 20
Registriert: Montag 1. Oktober 2018, 12:35

Alle Items (Listen) einer Kategorie sollen verglichen werden. Hierzu soll das erste Objekt einer Liste mit dem ersten Objekt einer anderen Liste verglichen werden usw. Der Vergleich soll aufzeigen, ob einer der Werte größer, kleiner oder gleich dem anderen Wert ist.

Beispiel:
Item1 besitzt:
300 Health Points
50 Physical Power

Item2 besitzt:
400 Health Points
50 Physical Power

Nach dem Vergleich soll aufgezeigt werden, dass der erste Wert des zweiten Items höher ist als der des ersten Items, sich die physische Kraft jedoch nicht unterscheidet. Das zweite Item wird anschließend als besser klassifiziert und das erste Item scheidet aus. Der Vergleich geht nun weiter mit dem zweiten und dritten Item.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wie gesagt, klingt für mich nach sorted(). Mehrere Eigenschaften lassen sich als Tupel ausdrücken. Wobei man da natürlich schauen muss, ob die Vergleichslogik für Tupel so gewünscht ist.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@epicpython: Du hast also Items mit Eigenschaften. Da ist eine Liste der falsche Datentyp. Ein Wörterbuch wäre besser geeignet. Wenn die Eigenschaften vorher definiert sind, ist ein Named-Tuple wohl am besten. Oder gleich eine eigene Klasse.

Dann willst Du eine Funktion schreiben, die zwei Items vergleicht, da ist mir noch unklar, was passieren soll, wenn eine Eigenschaft größer, die andere aber kleiner ist.

Was dann nach dem Vergleich passiert, ist mir noch unklar. Was soll „ausscheiden” bedeuten?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@epicpython: Deine Items haben Eigenschaften, lassen sich also besser als Objekte abbilden, denn als Listen. Auf Klassen kannst Du Methoden wie __gt__ anlegen, welche das Sortierverhalten definieren. Dann reicht ein einfaches sortieren einer Liste, um zum gewünschten Ergebnis zu kommen.
Antworten