Liste von Tupeln filtern

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
Python2021
User
Beiträge: 2
Registriert: Montag 2. August 2021, 18:36

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 !
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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`.
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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 :P

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
-----
Yet Another Python Developer
Python2021
User
Beiträge: 2
Registriert: Montag 2. August 2021, 18:36

@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" :D .Mit der Lösung von YAPD habe ich ein Ergebnis rausbekommen. Danke nochmal für eure sehr schnelle Unterstützung.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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:

Code: Alles auswählen

sports = list(set(athlet[2] for athlet in athleten))
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Und wenn man die Sportarten in der ursprünglichen Reihenfolge haben will, gibt es `more_itertools.unique_everseen`.
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
Antworten