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?
List Comprehension eine Liste?
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)
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...
- __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:
Ausgabe:
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()
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