Seite 1 von 1
Liste von Tupeln filtern
Verfasst: Montag 2. August 2021, 19:02
von Python2021
Guten Abend zusammen,
ich bin neu hier im Forum. Vor kurzem habe ich angefangen mich mit Python auseinanderzusetzen.
Jetzt habe ich eine Aufgabe gegeben, die zu den Basics gehört, aber irgendwie bekomme ich es nicht hin.
Beispiel:
Ein Tupel ist gegliedert in (Nummer, Name, Sportart, Geschlecht). Ich möchte eine Liste aus folgenden Tupeln erstellen, bei denen das 2. Element sprich die Sportart ausgegeben wird. Dabei darf die Sportart nicht doppelt vorkommen. Vielleicht würde ich die Aufgabe hinbekommen, wenn ich wüsste, wie ich auf jedes 2. Element eines Tupels zugreifen kann.
athleten = [(87689776, 'Aauri Lorena Bokesa', 'athletics', 'female'),
(997877719, 'Ababel Yeshaneh', 'riding', 'female'),
(343694681, 'Abadi Hadis', 'athletics', 'male'),
(591319906, 'Abbas Abubakar Abbas', 'cycling', 'male'),
(258556239, 'Abbas Qali', 'aquatics', 'male') ]
Ich hoffe das mein Problem verständlich geschildert wurde und würde mich über eine Hilfe wirklich freuen, Danke !
Re: Liste von Tupeln filtern
Verfasst: Montag 2. August 2021, 19:23
von Sirius3
Indexzugriff sagt Dir was?
Code: Alles auswählen
athlet = (87689776, 'Aauri Lorena Bokesa', 'athletics', 'female')
print(athlet[2])
Jetzt brauchst Du noch eine for-Schleife, um das für jede Athleten in der Liste zu machen.
Besser wäre es, gleich von Anfang an namedtuples zu benutzen, dann braucht man sich erst gar nicht mit der kryptischen 2 herumärgern:
Code: Alles auswählen
from collections import namedtuple
Athlet = namedtuple("Athlet", "nummer,name,sportart,geschlecht")
athleten = [
Athlet(87689776, 'Aauri Lorena Bokesa', 'athletics', 'female'),
Athlet(997877719, 'Ababel Yeshaneh', 'riding', 'female'),
Athlet(343694681, 'Abadi Hadis', 'athletics', 'male'),
Athlet(591319906, 'Abbas Abubakar Abbas', 'cycling', 'male'),
Athlet(258556239, 'Abbas Qali', 'aquatics', 'male')
]
sondern man kann per Attribut zugreifen: `athlet.sportart`.
Re: Liste von Tupeln filtern
Verfasst: Montag 2. August 2021, 19:50
von YAPD
Hey,
jetzt überschneidet es sich zwar, aber ich wollte meinen Code trotzdem noch posten.
Wahrscheinlich ist Sirius Lösung sauberer, da bin ich relativ sicher :O
Code: Alles auswählen
athleten = [
(87689776, 'Aauri Lorena Bokesa', 'athletics', 'female'),
(997877719, 'Ababel Yeshaneh', 'riding', 'female'),
(343694681, 'Abadi Hadis', 'athletics', 'male'),
(591319906, 'Abbas Abubakar Abbas', 'cycling', 'male'),
(258556239, 'Abbas Qali', 'aquatics', 'male')
]
Sports = [ ]
for athlet in athleten :
if athlet[2] not in Sports:
print(athlet[0] , ":" , athlet[1] , ":" , athlet[2])
Sports.append(athlet[ 2 ])
else:
print( "The sport '" + athlet[2] + "' is already represented." )
Viele GRüße
YAPD
Re: Liste von Tupeln filtern
Verfasst: Montag 2. August 2021, 20:12
von Python2021
@Sirius 3 und @YAPD Lieben Dank für eure Hilfe. Sirius3 deine Lösung war für mich etwas schwer nachvollziehbar. Es liegt aber sicherlich an meinen "Skills"

.Mit der Lösung von YAPD habe ich ein Ergebnis rausbekommen. Danke nochmal für eure sehr schnelle Unterstützung.
Re: Liste von Tupeln filtern
Verfasst: Montag 2. August 2021, 21:07
von Sirius3
Ich liefere ja auch keine Lösungen zu Hausaufgaben, denn es ist wenig lehrreich, wenn Du einfach nur abtippen brauchst.
@YAPD: Variablennamen schreibt man komplett klein. Vor , und : wird kein Leerzeichen gesetzt.
Statt Strings mit + zusammenzustückeln benutzt man Format-Strings.
Code: Alles auswählen
sports = [ ]
for athlet in athleten:
if athlet[2] not in sports:
print(athlet[0], athlet[1], athlet[2], sep=" : ")
sports.append(athlet[2])
else:
print(f"The sport '{athlet[2]}' is already represented." )
Die vielen Wiederholungen der magischen 2 macht den Code nicht lesbar:
Code: Alles auswählen
for athlet in athleten:
sport = athlet[2]
if sport not in sports:
sports.append(sport)
else:
print(f"The sport '{sport}' is already represented." )
Der Einzeiler benutzt ein Set:
Re: Liste von Tupeln filtern
Verfasst: Montag 2. August 2021, 21:28
von narpfel
Und wenn man die Sportarten in der ursprünglichen Reihenfolge haben will, gibt es
`more_itertools.unique_everseen`.
Re: Liste von Tupeln filtern
Verfasst: Montag 2. August 2021, 21:51
von YAPD
Ich muss nochmal sagen, dass du auf jeden Fall lieber mit Sirius Lösung arbeiten
solltest, da diese einfach sauberer ist und dich ein bisschen mit dem Hintergrund
beschäftigen. Auch wenn mein Code funktioniert, obwohl ich es praktisch "falsch"
oder unsauber gemacht habe, ist sein Code sehr verständlich, verständlicher als
meiner auf jeden Fall
Du erhältst bei Fragen bestimmt hier im Forum Unterstützung, auch von mir,
soweit ich kann
VG
YAPD