Seite 1 von 1
Bestimmte Elemente in einer Liste herauspicken (geloest)
Verfasst: Montag 30. Oktober 2006, 23:24
von Neandertaler
Hallo zusammen,
ich beschaeftige mich jetzt seid kurzem ein wenig mit Python und lese auch schon seid einigen Tagen fleissig hier im Forum mit.
Bin jetzt an einem trivialen Problem haengengeblieben und finde nirgends einen Hinweis dies moeglichst elegant zu loesen.
Code: Alles auswählen
#Sowas (Perl-Style) scheint nicht zu gehen:
(element_1, element_4, element_9, element_17) = string.split(str_file_in_dir,".")[1,4,9,17]
Kann ich mehrere (nicht zusammenhaengende) Listenelemente ueber den Index ansprechen?
Vielen Dank schonmal
Gruss
Oliver
Re: Bestimmte Elemente in einer Liste herauspicken
Verfasst: Montag 30. Oktober 2006, 23:50
von Leonidas
Hallo Oliver, willkommen im Forum,
Neandertaler hat geschrieben:Kann ich mehrere (nicht zusammenhaengende) Listenelemente ueber den Index ansprechen?
Naja, nicht direkt, aber du kannst zum beispiel diese, recht seltsame Konstruktion schnappen, die genau so etwas macht. Die Lesbarkeit ist natürlich total mies
Code: Alles auswählen
In [31]: elemente = [char for char in 'abcdefghijklmnopqrstuvwxyz']
In [32]: [element for index, element in enumerate(elemente) if index in [1, 4, 9, 17]]
Out[32]: ['b', 'e', 'j', 'r']
(Zeile 31 erstellt erst einmal eine Liste mit elementen, der Zugriff auf die Elemente findet erst in Zeile 32 statt)
Vermutlich gibt es sogar noch eine elegantere Möglichkeit aber es ist spät und je später es wird, desto eher neige ich dazu, jedes Problem mit List Comprehensions zu lösen.
Re: Bestimmte Elemente in einer Liste herauspicken
Verfasst: Montag 30. Oktober 2006, 23:59
von Neandertaler
Leonidas hat geschrieben:Hallo Oliver, willkommen im Forum,
Code: Alles auswählen
In [31]: elemente = [char for char in 'abcdefghijklmnopqrstuvwxyz']
In [32]: [element for index, element in enumerate(elemente) if index in [1, 4, 9, 17]]
Out[32]: ['b', 'e', 'j', 'r']
(Zeile 31 erstellt erst einmal eine Liste mit elementen, der Zugriff auf die Elemente findet erst in Zeile 32 statt)
Vermutlich gibt es sogar noch eine elegantere Möglichkeit aber es ist spät und je später es wird, desto eher neige ich dazu, jedes Problem mit List Comprehensions zu lösen.
Hallo Leonidas, erstmal herzlichen Dank
aber den den Code muss ich mir erstmal in mein Eclipse reinpasten um zu sehen was da genau passiert
Meine Chancen das diese Nacht noch zu kapieren schwinden aber auch von Minute zu Minute
Verfasst: Dienstag 31. Oktober 2006, 00:31
von Leonidas
Und weil es heute so lustig ist, fürhen wir mal ein paar Perl-Datentypen in Python ein. Ich hätte eine Liste anzubieten die sich in der Hinsicht ähnlich verhält wie eine Perl-Liste:
Code: Alles auswählen
class PerlList(list):
def __getitem__(self, items):
try:
return [super(PerlList, self).__getitem__(item) for item in items]
except TypeError:
return super(PerlList, self).__getitem__(items)
Okay, wollen wir das mal testen:
Code: Alles auswählen
# erstellen wir erstmal eine normale Liste mit den Elementen
nl = [char for char in 'abcdefghijklmnopqrstuvwxyz']
# konvertieren wir es mal in eine pseudo-Perl-Liste
pl = PerlList(nl)
# und holen wir uns die entsprechenden Stellen heraus
print pl[1]
print pl[1, 4, 9, 17]
Und hier wieder der übliche Hinweis:
Kids, don't try this at home, unless you know what you're doing. Allerdings würde ich persönlich auch lieber meine erste Lösung mit der LC nehmen als eine Listen-Klasse zu implementieren. Ich wollte nur schauen ob sowas geht
Verfasst: Dienstag 31. Oktober 2006, 08:45
von BlackJack
Vielleicht sollte man besser über die Idizes iterieren statt alle Elemente der Originalsequenz durch zu nummerieren:
Code: Alles auswählen
In [26]: [items[i] for i in (1, 4, 9, 17)]
Out[26]: ['b', 'e', 'j', 'r']
Verfasst: Dienstag 31. Oktober 2006, 08:47
von Leonidas
BlackJack hat geschrieben:Vielleicht sollte man besser über die Idizes iterieren statt alle Elemente der Originalsequenz durch zu nummerieren:
Stimmt - irgendwie wusste ich gestern, dass ich ziemlich seltsamen Quark zusammenschreibe
Verfasst: Dienstag 31. Oktober 2006, 09:05
von Neandertaler
BlackJack hat geschrieben:Vielleicht sollte man besser über die Idizes iterieren statt alle Elemente der Originalsequenz durch zu nummerieren:
Code: Alles auswählen
In [26]: [items[i] for i in (1, 4, 9, 17)]
Out[26]: ['b', 'e', 'j', 'r']
Super - sehr elegös
Vielen Dank
Gruss
Oliver
Re: Bestimmte Elemente in einer Liste herauspicken
Verfasst: Dienstag 31. Oktober 2006, 10:23
von Y0Gi
Irre ich mich, oder kann man auf
Code: Alles auswählen
elemente = [char for char in 'abcdefghijklmnopqrstuvwxyz']
verzichten und direkt
verwenden?
Verfasst: Dienstag 31. Oktober 2006, 10:38
von BlackJack
Du irrst Dich nicht:
Code: Alles auswählen
In [43]: list(enumerate('abcd...'))
Out[43]: [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, '.'), (5, '.'), (6, '.')]