Bestimmte Elemente in einer Liste herauspicken (geloest)

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
Neandertaler
User
Beiträge: 4
Registriert: Donnerstag 19. Oktober 2006, 10:34
Wohnort: Erkrath

Montag 30. Oktober 2006, 23:24

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
Zuletzt geändert von Neandertaler am Dienstag 31. Oktober 2006, 09:05, insgesamt 1-mal geändert.
Wie kann ich wissen was ich denke bevor ich höre was ich sage...?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 30. Oktober 2006, 23:50

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Neandertaler
User
Beiträge: 4
Registriert: Donnerstag 19. Oktober 2006, 10:34
Wohnort: Erkrath

Montag 30. Oktober 2006, 23:59

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:
Wie kann ich wissen was ich denke bevor ich höre was ich sage...?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 31. Oktober 2006, 00:31

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
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Dienstag 31. Oktober 2006, 08:45

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']
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 31. Oktober 2006, 08:47

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 ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Neandertaler
User
Beiträge: 4
Registriert: Donnerstag 19. Oktober 2006, 10:34
Wohnort: Erkrath

Dienstag 31. Oktober 2006, 09:05

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
Wie kann ich wissen was ich denke bevor ich höre was ich sage...?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dienstag 31. Oktober 2006, 10:23

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?
BlackJack

Dienstag 31. Oktober 2006, 10:38

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, '.')]
Antworten