Zugriff auf nicht aufeinanderfolgende Elemente in einer Liste oder einem string in python
Soweit ich kann sagen, dies ist nicht offiziell nicht möglich, aber gibt es einen "trick", um Zugriff auf beliebige nicht-sequentielle Elemente einer Liste durch aufschneiden?
Beispiel:
>>> L = range(0,101,10)
>>> L
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
Nun möchte ich in der Lage sein zu tun
a,b = L[2,5]
so, dass a == 20
und b == 50
Einen Weg neben den beiden Aussagen wäre etwas dummes wie:
a,b = L[2:6:3][:2]
Aber, dass nicht skaliert werden, bei der alle unregelmäßigen Abständen.
Vielleicht mit list comprehension mit den Indizes, die ich will?
[L[x] for x in [2,5]]
Ich würde gerne wissen, was es wird empfohlen, für dieses gemeinsame problem.
a,b = L[2],L[5]
?- Das macht es einfach Aussehen, aber ich wollte wenden diese direkt an den Ausgang einer Funktion, die eine Liste zurückgibt, ohne einen Aufruf der Funktion zweimal oder re-Zuweisung, die eine variable und dann packte.
- Ich bin geneigt zu sagen, dass Ihre Liste Einsicht ist das beste, was Sie tun können. Oder, wenn Sie nicht brauchen, eine aktuelle Liste, verwenden Sie einen generator-Ausdruck, wie in Shashank Gupta Antwort (obwohl, wenn Sie nur brauchen Sie es einmal, Sie könnten einfach die genexp inline, anstatt eine Funktion zurück).
InformationsquelleAutor beroe | 2013-10-02
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sowas?
Verwendung:
Die Art und Weise der Funktion ist durch Rücksendung eine generator-Objekt, die Durchlaufen werden können über ähnlich zu irgendeiner Art von Python-Sequenz.
Als @justhalf angemerkt in den Kommentaren, die Aufrufsyntax kann geändert werden, indem die Art und Weise definieren Sie die Parameter für die Funktion.
Und dann könnte man die Funktion aufrufen mit:
oder eine Liste Ihrer Wahl.
Update: ich jetzt empfehlen die Verwendung
operator.itemgetter
statt, es sei denn, Sie wirklich brauchen, die lazy evaluation Funktion von Generatoren. Sehen John Y s Antwort.select(lst, indices)
und nannte es alsselect(L, [2,5])
besser wäre?operator.itemgetter
statt, es sei denn, die lazy-evaluation-Funktion von Generatoren erforderlich ist.Wohl am nächsten, was du suchst, ist
itemgetter
(oder hier für Python 2 docs):itemgetter
ist sehr ähnlich zu Shashank Antwort, außer die, die sich schon in der Python-standard-Bibliothek.import
obwohl es hauptsächlich wickelte die OP in die definition einer Funktion.itemgetter
als um eine neue Funktion definieren. Ein import ist kürzer und einfacher als eine definition einer Funktion.>>> L = list(range(0, 101, 10))
zum ausführen der "identischen" Betrieb.Wenn Sie verwenden können
numpy
können Sie genau das tun:numpy.array
ist sehr ähnlich zulist
nur, dass es unterstützt mehr Betrieb, wie z.B. mathematische Operationen und auch beliebige index-Auswahl wie wir hier sehen.numpy
ist eine große - Bibliothek, und diese Antwort zieht die ganze Sache in. (Vielleichtfrom numpy import array
?) (b):numpy
ist konkret für mathematische Operationen, so ist das weniger bekannte Leute, die den Fokus auf beispielsweise back-end-web-Entwicklung.itemgetter
ist näher an "blanken" Python, erreicht ein breiteres Publikum.from numpy import array
noch laden die ganze numpy-Paket, glaube ich. Aber du hast Recht, das wäre des guten zuviel, wenn die Liste nicht für mathematische Operationen verwendet.Nur der Vollständigkeit halber, die Methode von der ursprünglichen Frage ist ziemlich einfach. Würden Sie wollen, wickeln Sie es in eine Funktion, wenn
L
ist eine Funktion selbst, oder weisen Sie das Ergebnis der Funktion an eine variable vorher, damit es nicht immer wieder aufgerufen:Natürlich würde es auch für einen string...
Keiner der anderen Antworten wird für die Arbeit mehrdimensionales Objekt schneiden. IMHO ist dies die Allgemeine Lösung (verwendet
numpy
):numpy.ix_
ermöglicht Ihnen die Auswahl beliebiger Indizes in allen Dimensionen eines Arrays gleichzeitig.z.B.:
numpy