List Comprehension eine Liste?

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
lropro
User
Beiträge: 3
Registriert: Dienstag 23. November 2021, 01:00

Kurs = { "eip": [(123456, "Alan Smithee"), (123455, "Jane Graph"), (145612, "Joe Shmoe")],

"eis": [(122345, "Fred Bloggs"), (211459, "Tommy Atkins"), (128763, "Jane Roe"), (215682, "Jack Sixpack")],

"bigdata": [(249845, "Polly Graph"), (204752, "Lukas Smithee"), (234518, "Joe Shmoe"), (258215, "Alice Bloggs")] }

Hallo,wie kann man mit List Comprehension eine Liste aller Menschen, die nach den Nachnamen sortiert ist, in python erstellen?
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du schon probiert? Wie würdest Du das mit einer for-Schleife machen?
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Code: Alles auswählen

liste = [(249845, "Polly Graph"), (204752, "Lukas Smithee"), (234518, "Joe Shmoe")]
liste.sort(key=lambda x: x[1].split(" ")[-1])
print(liste)
Hilft dir der Code-Abschnitt weiter? Du musst die mittlere Zeile grob (nach dem Doppelpunkt) versehen, sonst hilft dir die Lösung nicht weiter.

Als Hinweis zur Lösung: Ich kann so eine Aufgabe (Spezialfall) auch nicht aus dem Stand lösen, also google ich und gucke solche Sonderfälle bei Stackoverflow nach:

https://stackoverflow.com/questions/8459231/sort-tuples-based-on-second-parameter

So ein Problem geht man häufig gerne mit einem Lambda-Ausdruck an. Beim anderen Problem (alle Personendaten in eine Liste) würde ich auch noch mal suchen, auch das ist die Arbeit eines Programmierers, auch das erscheint mir als ein Spezialfall, den man i. d. R. nicht weiß und deshalb nachguckt...
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@lropro: Was bedeutet denn die Zahl in den Tupeln? Ist das eine ID, damit man beispielsweise den einen "Joe Shmoe" von dem anderen "Joe Schmoe" unterscheiden kann, oder muss man den als Doublette sehen und raus filtern?

Und ganz allgemein wäre das eine unlösbare Aufgabe weil man ganz allgemein nicht Vor- und Nachname trennen kann wenn man reale Namen verarbeiten müsste.

Das könnte mit einer „list comprehension“ alles ein bisschen tricky werden. Falls es ausreicht das in einen Ausdruck zu packen, könnte man das so machen:

Code: Alles auswählen

#!/usr/bin/env python3
from itertools import chain
from operator import itemgetter
from pprint import pprint


def main():
    kurs = {
        "eip": [
            (123456, "Alan Smithee"),
            (123455, "Jane Graph"),
            (145612, "Joe Shmoe"),
        ],
        "eis": [
            (122345, "Fred Bloggs"),
            (211459, "Tommy Atkins"),
            (128763, "Jane Roe"),
            (215682, "Jack Sixpack"),
        ],
        "bigdata": [
            (249845, "Polly Graph"),
            (204752, "Lukas Smithee"),
            (234518, "Joe Shmoe"),
            (258215, "Alice Bloggs"),
        ],
    }

    pprint(
        sorted(
            map(itemgetter(1), chain.from_iterable(kurs.values())),
            key=lambda name: name.split()[-1],
        )
    )


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

['Tommy Atkins',
 'Fred Bloggs',
 'Alice Bloggs',
 'Jane Graph',
 'Polly Graph',
 'Jane Roe',
 'Joe Shmoe',
 'Joe Shmoe',
 'Jack Sixpack',
 'Alan Smithee',
 'Lukas Smithee']
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten