Frage

Ich brauche die letzten 9 Nummern einer Liste, und ich bin sicher, dass es eine Möglichkeit, es mit Slicing zu tun ist, aber ich kann nicht scheinen, um es zu bekommen. Ich kann die ersten 9 wie diese:

num_list[0:9]

Jede Hilfe wäre toll.

War es hilfreich?

Lösung

Sie können die negativen ganzen Zahlen für das mit dem Slicing-Operator verwenden. Hier ist ein Beispiel des Python-CLI-Interpreter:

>>> 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]

die wichtige Linie ist a[-9:]

Andere Tipps

ein negativer Index wird vom Ende der Liste zählen, so:

num_list[-9:]

Slicing

Python Slicing ist eine unglaublich schnelle Bedienung, und es ist eine praktische Möglichkeit, Teile Ihrer Daten schnell zugreifen.

Scheibe Notation die letzten neun Elemente aus einer Liste (oder einer anderen Sequenz, die es, wie ein String unterstützt) bekommen würde wie folgt aussehen:

num_list[-9:]

Als ich das sehen, las ich das Teil in den Klammern als „9 vom Ende, bis zum Ende.“ (Eigentlich habe ich abkürzen es mental als "-9, on")

Erklärung:

Die vollständige Notation ist

sequence[start:stop:step]

Aber der Doppelpunkt ist, was Python erzählt Du ihm ein Stück geben und keine regulären Index. Deshalb ist der idiomatische Weg des Kopierens Listen in Python 2

list_copy = sequence[:]

Und sie Clearing ist mit:

del my_list[:]

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

Geben Sie Ihre Scheiben einen beschreibenden Namen!

Sie finden es sinnvoll, die Scheibe zu trennen Bildung von an die list.__getitem__ Methode übergeben ( das ist, was die eckigen Klammern tun). Auch wenn Sie es nicht neu sind, es hält Ihr Code besser lesbar, so dass andere, die Ihr Code kann leichter lesen wissen, was Sie tun.

Sie können jedoch nicht nur ein paar Zahlen von Doppelpunkte einer Variablen getrennt zuweisen. Sie müssen das Segmentobjekt verwenden:

last_nine_slice = slice(-9, None)

Das zweite Argument, None, erforderlich ist, so dass das erste Argument als start Argument interpretiert wird sonst wäre es das stop Argument sein.

Sie können dann das Segmentobjekt zu Ihrer Sequenz übergeben:

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

islice

islice vom itertools Modul ist ein weiterer möglicherweise performant Weg, dies zu erhalten. islice nimmt nicht negativen Argumente, so im Idealfall Ihre iterable eine __reversed__ spezielle Methode hat - die Liste hat haben -. so müssen Sie zuerst Ihre Liste (oder iterable mit __reversed__) passieren reversed

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

Islice ermöglicht lazy Auswertung der Daten-Pipeline, so dass die Daten materialisieren, übergibt es an einen Konstruktor (wie list):

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

Die letzten 9 Elemente können von rechts nach links mit numlist gelesen werden [-9:], oder von rechts nach links numlist verwenden. [: - 10: 1], wie Sie wollen

>>> a=range(17)
>>> print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[-9:]
[8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[:-10:-1]
[16, 15, 14, 13, 12, 11, 10, 9, 8]

Hier sind mehrere Optionen für das Erhalten der „Schwanz“ Elemente eines iterable:

Da

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

Gewünschte Ausgabe

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

Code

Wir erhalten diese Ausgabe eine 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))

Details

  • A. Traditionelle Python Slicing ist auf die Sprache inhärent. Diese Option funktioniert mit Sequenzen wie Strings, Listen und Tupeln rel="nofollow. diese Art des Schneidens nicht funktioniert jedoch auf Iteratoren , zB iter(iterable).
  • B. Ein itertools Rezept . Es wird verallgemeinert auf jedem iterable zu arbeiten und löst das Problem Iterator in der letzten Lösung. Dieses Rezept muss manuell durchgeführt werden, da es nicht offiziell im itertools Modul enthalten ist.
  • C. Viele Rezepte, darunter das letztere Werkzeug (B) wurden in Pakete von Drittanbietern bequem implementiert. Installieren und diese Bibliotheken vermeidet manuelle Implementierung zu importieren. Eine dieser Bibliotheken ist more_itertools (via > pip install more-itertools installieren) genannt; finden Sie unter more_itertools.tail .
  • D. Ein Mitglied der itertools Bibliothek. Beachten Sie, itertools.islice unterstützt keine negativen Slicing .
  • E. Ein weiteres Werkzeug ist in more_itertools implementiert, die itertools.islice zu unterstützen negativen slicing verallgemeinert; finden Sie unter more_itertools.islice_extended .

Welche man verwende ich?

Es hängt . In den meisten Fällen Slicing (Option A, wie in anderen Antworten erwähnt) ist die einfachste Option, da es in die Sprache integriert und unterstützt die meisten iterable Typen. Weitere allgemeine Iteratoren, verwenden Sie einen der verbleibenden Optionen. Beachten Sie, Optionen C und E erfordern eine Drittanbieter-Bibliothek zu installieren, die einige Benutzer nützlich sein können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top