String Werte Vergleichen

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
cap7ain
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 17:01

Hallo,

ich habe folgende Liste: Torjäger = [(„Robert“, „30“), („Cristiano“, „30“), („Ciro“,“30“)].
Nun möchte ich über eine for-Schleife(for x in Torjäger?) vergleichen ob [0], also die Namen meiner Torjäger unterschiedlich sind und [1], die geschossenen Tore, gleich sind.
Wenn dies der Fall ist soll die Funktion ein True Wert liefern, wenn nicht einen False Wert.
Leider habe ich trotz etlicher Versuche keine Lösung gefunden. Jegliche Versuche haben Fehlermeldungen aller Art ausgespuckt, eventuell weiß hier jemand wie ich das hinbekommen kann.
Danke!
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du denn schon versucht? Zeige den Code dazu? Was ist da das Ergebnis und wie weicht das von Deinem erwarteten Ergebnis ab?
x ist ein schlechter Name für EINEN Torjäger und hier zeigt sich auch die Schwäche der deutschen Sprache, weil Jäger sowohl im Singular als auch im Plural gleich geschrieben wird. Im Englischen hätte die Liste einfach ein s hinten dran als Plural, an dem man erkennen kann, dass mehrere Torjäger in einer Liste gesammelt sind. Generell empfehle ich englische Bezeichner, da man dann beim Lesen nicht ständig zwischen deutschen Bezeichnern und englischen eingebauten Funktionen oder Schlüsselwörtern hin und her springen muß.
Warum sind die Zahlen Strings?
cap7ain
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 17:01

Ist jetzt eine wenig hilfreiche Antwort. Meine Bezeichnungen darf ich ja wohl noch so wählen wie sie für mich am geschicktesten sind. Egal ob englisch oder deutsch.
Die Zahlen sind Strings weil ich diese zB ja durch Vereine austauschen könnte. Also players =[(„Timo“,“Chelsea“), („Mason“,“Chelsea“), („Matteo“, „Chelsea“)]

Dann habe ich zB versucht über

for player in players:
If player[0] != player+1[0] and player[1] == Player+1[1]:
Return True

Die Funktion zu schreiben. Aber ich weiß leider nicht wie ich die jeweils einzelnen Indexe so vergleiche das Player1 mit Player2 & Player3 verglichen wird etc.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@cap7ain: Am geschicktesten sind englische Bezeichner. Warum hat Sirius3 geschrieben.

Geschossene Tore sind Zahlen und sollten auch Zahlen sein. Das man die durch etwas mit einer ganz anderen Bedeutung und dann auch einem anderen Typ ersetzen kann ist keine gute Begründung Zahlen als Zeichenketten zu speichern.

`player` ist ein Tupel und ``player + 1`` wird natürlich mit einem Fehler quittiert. Was hättest Du an der Stelle denn erwartet was das Ergebnis eines Tupels mit zwei Zeichenketten + 1 sein sollte?

Gross- und Kleinschreibung spielt in Python eine Rolle. `player` ist ein anderer Name als `Player` und ``Return True`` ist ein Syntaxfehler weil das Schlüsselwort ``return`` heisst und `Return` ein Name ist und zwei Namen durch ein Leerzeichen getrennt machen keinen Sinn.

Für die beiden Teilprüfungen wäre der `set()`-Datentyp nützlich. Steck da alle Werte rein und überlegen wie viele Elemente das Ergebnis jeweils haben müsste.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bin verwirrt. Ist das zweite Element jetzt die Mannschaft, oder die Anzahl der Tore?

Wie dem auch sei, die Loesung ist trivial:

Code: Alles auswählen

import itertools
import operator
torjaeger = [("Robert", "28"), ("Cristiano", "30"), ("Ciro", "30"), ("Overath", "1000")]

for _, entries in itertools.groupby(sorted(torjaeger, key=operator.itemgetter(1)), key=operator.itemgetter(1)):
    print(list(entries))
cap7ain
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 17:01

Es muss doch auch eine Lösung ohne das importieren von itertools geben? Ist schon etwas frech zu behaupten die Lösung sein „trivial“! Wenn sie das wäre würde ich mich nicht in diesem Forum melden. Nicht jeder hier wird auf dem gleichen Niveau sein...

Ob Tore, Mannschaften oder sonst etwas ist erstmal egal. Gehen wir mal nur von Strings aus und vergessen die Tore als integer. Das möchte ich gerne flexibel halten um die Funktion auf mehrere Listen anwenden zu können.

ich könnte auch die Indexe so ansprechen:

players = [(„Gareth“,“Real“), („Karim“,“Real“)]

if players[0][1] == players [1][1] and players [0][0] != players[1][0]:
return True

Aber das müsste ja über eine Schleife & Variable ja einfacher funktionieren bzw. so dass ich das unabhängig von der Länge der Liste verwenden kann & das ist immer noch die Lösung die ich suche...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und was ist an der itertools Lösung das Problem?
cap7ain
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 17:01

Wow...das Forum kann man sich auch sparen...

Ich bin einfach auf der Suche nach einer Lösung ohne itertools, da mein Python Niveau noch auf Anfänger Level ist & ich die itertools Schritte nicht nachvollziehen kann
Aber anscheinend ist es ja nicht gestattet & man muss sich hier wohl für alles rechtfertigen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn es schon Zuviel verlangt ist, das man erklärt, warum man einem Geschenkten Gaul ins Maul schauen muss, und auch ansonsten jeder Hinweis eine unerträgliche Zumutung ist - dann kann man sich die Interaktion mit dir definitiv auch sparen. Viel Erfolg.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Am Anfang schriebst Du noch, dass Du prüfen willst, ob alle ersten Elemente unterschiedlich und alle zweiten Elemente gleich sind.
Dafür sind Sets ideal:

Code: Alles auswählen

player_names = set(n for n, g in players)
goals = set(g for n,g in players)
Jetzt mußt Du nur überlegen, was es für ein Set bedeutet, wenn alle Elemente gleich sind oder alle unterschiedlich.
cap7ain
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 17:01

Ja richtig. Das möchte ich auch, mit Hilfe einer Funktion. Sets kenn ich auch noch nicht werde ich definitiv näher ansehen!

Dachte halt man könnte das anwählen der Elemente, um diese dann zu vergleichen, mithilfe von Index & For Schleifen „automatisieren“
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Einen Index zu benutzen ist im Normalfall kompliziert und fehleranfällig. Daher versucht man das zu vermeiden. Mit Schleife und Index ist es auch schwierig zu prüfen, ob alle Elemente unterschiedlich sind.
cap7ain
User
Beiträge: 6
Registriert: Montag 27. Juli 2020, 17:01

Würde es theoretisch trotzdem gehen? Und wenn ja, wie würde eine Umsetzung in Code aussehen?
Antworten