439 Stimmen

Wie erhält man die letzten Elemente einer Liste in Python?

Ich benötige die letzten 9 Zahlen einer Liste, und ich bin sicher, dass es eine Möglichkeit gibt, dies mit Slicing zu tun, aber ich kann es nicht finden. Ich kann die ersten 9 wie folgt erhalten:

num_list[0:9]

755voto

winsmith Punkte 19252

Mit dem Slicing-Operator f können Sie negative ganze Zahlen verwenden

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a[-9:]
[4, 5, 6, 7, 8, 9, 10, 11, 12]

t a[-9:]

138voto

cobbal Punkte 68319

Ein negativer Index wird vom Ende der Liste her gezählt, also:

num_list[-9:]

105voto

Schneiden von

Python Slicing ist ein unglaublich schneller Vorgang und eine praktische Methode, um schnell auf Teile Ihrer Daten zuzugreifen.

Die Slice-Notation, um die letzten neun Elemente einer Liste (oder einer anderen Sequenz, die dies unterstützt, wie z. B. eine Zeichenkette) zu erhalten, würde wie folgt aussehen:

num_list[-9:]

Wenn ich das sehe, lese ich den Teil in den Klammern als "9. vom Ende bis zum Ende". (Eigentlich kürze ich es gedanklich ab als "-9, am")

Erläuterung:

Die vollständige Notation lautet

sequence[start:stop:step]

Aber der Doppelpunkt sagt Python, dass es sich um einen Slice und nicht um einen regulären Index handelt. Deshalb ist die idiomatische Art des Kopierens von Listen in Python 2

list_copy = sequence[:]

Und die Abrechnung erfolgt mit:

del my_list[:]

(Listen erhalten list.copy y list.clear in Python 3).

Geben Sie Ihren Schnitten einen beschreibenden Namen!

Es kann sinnvoll sein, die Bildung des Slice von der Übergabe an die list.__getitem__ Methode ( dafür sind die eckigen Klammern da ). Auch wenn Sie nicht neu in diesem Bereich sind, bleibt Ihr Code dadurch besser lesbar, so dass andere, die Ihren Code lesen müssen, leichter verstehen können, was Sie tun.

Sie können jedoch nicht einfach einige durch Doppelpunkte getrennte ganze Zahlen einer Variablen zuweisen. Sie müssen das Slice-Objekt verwenden:

last_nine_slice = slice(-9, None)

Das zweite Argument, None erforderlich, so dass das erste Argument als die start Argument sonst wäre es die stop Argument .

Sie können dann das Slice-Objekt an Ihre Sequenz übergeben:

>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]

islice

islice aus dem itertools-Modul ist eine weitere, möglicherweise leistungsfähige Möglichkeit, dies zu erreichen. islice nimmt keine negativen Argumente an, daher hat Ihre Iterable idealerweise eine __reversed__ besondere Methode - welche Liste fait haben - Sie müssen also zuerst Ihre Liste (oder iterable mit __reversed__ ) an reversed .

>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>

islice ermöglicht eine verzögerte Auswertung der Datenpipeline. Um die Daten zu materialisieren, übergeben Sie sie an einen Konstruktor (wie list ):

>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]

11voto

pylang Punkte 33775

Es gibt mehrere Möglichkeiten, um die "hinteren" Elemente einer Iterablen zu erhalten:

Gegeben

n = 9
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Gewünschter Output

[2, 3, 4, 5, 6, 7, 8, 9, 10]

Code

Die letztgenannte Ausgabe erhalten wir mit einer der folgenden Optionen:

from collections import deque
import itertools

import more_itertools

# A: Slicing
iterable[-n:]

# B: Implement an itertools recipe
def tail(n, iterable):
    """Return an iterator over the last *n* items of *iterable*.

        >>> t = tail(3, 'ABCDEFG')
        >>> list(t)
        ['E', 'F', 'G']

    """
    return iter(deque(iterable, maxlen=n))
list(tail(n, iterable))

# C: Use an implemented recipe, via more_itertools
list(more_itertools.tail(n, iterable))

# D: islice, via itertools
list(itertools.islice(iterable, len(iterable)-n, None))

# E: Negative islice, via more_itertools
list(more_itertools.islice_extended(iterable, -n, None))

Einzelheiten

  • A. Traditionelle Python Aufschneiden ist ein fester Bestandteil der Sprache. Diese Option funktioniert mit Sequenzen wie Zeichenketten, Listen und Tupel. Diese Art des Slicings funktioniert jedoch nicht bei Iteratoren z.B. iter(iterable) .
  • B. Eine itertools Rezept . Es ist so verallgemeinert, dass es mit jeder Iterablen funktioniert und das Iterator-Problem in der letzten Lösung behebt. Dieses Rezept muss manuell implementiert werden, da es nicht offiziell in der itertools Modul.
  • C. Viele Rezepte, einschließlich des letztgenannten Werkzeugs (B), sind bequem in Paketen von Drittanbietern implementiert worden. Durch die Installation und den Import dieser Bibliotheken entfällt die manuelle Implementierung. Eine dieser Bibliotheken heißt more_itertools (Installation über > pip install more-itertools ); siehe more_itertools.tail .
  • D. Ein Mitglied der itertools Bibliothek. Anmerkung, itertools.islice unterstützt kein negatives Slicing .
  • E. Ein weiteres Werkzeug ist implementiert in more_itertools die verallgemeinert itertools.islice zur Unterstützung des negativen Slicing; siehe more_itertools.islice_extended .

Welche soll ich verwenden?

Es kommt darauf an . In den meisten Fällen ist Slicing (Option A, wie in anderen Antworten erwähnt) die einfachste Option, da sie in die Sprache eingebaut ist und die meisten iterierbaren Typen unterstützt. Für allgemeinere Iteratoren sollten Sie eine der übrigen Optionen verwenden. Beachten Sie, dass die Optionen C und E die Installation einer Bibliothek eines Drittanbieters erfordern, was für manche Benutzer nützlich sein kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X