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 :lol:
Meine Chancen das diese Nacht noch zu kapieren schwinden aber auch von Minute zu Minute :wink:

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

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

Code: Alles auswählen

enumerate('abcdefghijklmnopqrstuvwxyz')
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, '.')]