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]
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]
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")
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).
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]
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
iter(iterable)
.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.more_itertools
(Installation über > pip install more-itertools
); siehe more_itertools.tail
.itertools
Bibliothek. Anmerkung, itertools.islice
unterstützt kein negatives Slicing .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 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.