Seite 1 von 1
List Comprehension eine Liste?
Verfasst: Donnerstag 13. Januar 2022, 22:49
von lropro
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?
Re: List Comprehension eine Liste?
Verfasst: Donnerstag 13. Januar 2022, 23:12
von Sirius3
Was hast Du schon probiert? Wie würdest Du das mit einer for-Schleife machen?
Re: List Comprehension eine Liste?
Verfasst: Freitag 14. Januar 2022, 00:28
von pixewakb
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...
Re: List Comprehension eine Liste?
Verfasst: Freitag 14. Januar 2022, 01:26
von __blackjack__
@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']