Jak uzyskać ostatnie pozycje listy w Pythonie?

Potrzebuję ostatnich 9 numerów z listy i jestem pewien, że można to zrobić z krojeniem, ale nie mogę tego zrozumieć. Pierwsze 9 mogę dostać tak:

num_list[0:9]
Author: Dharman, 2009-03-14

5 answers

Możesz użyć ujemnych liczb całkowitych z operatorem krojenia. Oto przykład użycia interpretera Pythona CLI:

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

Ważna linia to a[-9:]

 582
Author: winsmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-14 20:22:54

Indeks ujemny będzie liczony od końca listy, więc:

num_list[-9:]
 106
Author: cobbal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-14 20:21:07

Krojenie

Wycinanie Pythona jest niewiarygodnie szybką operacją i jest poręcznym sposobem na szybki dostęp do części danych.

Notacja wycinka, aby uzyskać ostatnie dziewięć elementów z listy (lub dowolną inną sekwencję, która ją obsługuje, jak łańcuch znaków) wyglądałaby tak:

num_list[-9:]

Kiedy to widzę, czytam część w nawiasach jako " 9th od końca, do końca."(Właściwie skracam to mentalnie jako "-9, on")

Wyjaśnienie:

Pełna notacja jest

sequence[start:stop:step]

Ale dwukropek mówi Pythonowi, że dajesz mu kawałek, a nie zwykły indeks. Dlatego idiomatyczny sposób kopiowania list w Pythonie 2 to

list_copy = sequence[:]

I czyszczenie ich jest z:

del my_list[:]

(listy get list.copy i list.clear w Pythonie 3.)

Nadaj swoim plastrom opisową nazwę!

Przydatne może okazać się oddzielenie wycinka od przekazania go do metody list.__getitem__ (tak robią nawiasy kwadratowe). Nawet jeśli nie jesteś dzięki niemu Twój kod jest bardziej czytelny, aby inni, którzy będą musieli go przeczytać, mogli łatwiej zrozumieć, co robisz.

Nie można jednak po prostu przypisać kilku liczb całkowitych oddzielonych dwukropkami do zmiennej. Należy użyć obiektu slice:

last_nine_slice = slice(-9, None)

Drugi argument, None, jest wymagany, więc pierwszy argument jest interpretowany jako argument start W przeciwnym razie byłby to argument stop .

Możesz następnie przekazać obiekt slice do twoja Sekwencja:

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

islice

islice z modułu itertools jest inny możliwy sposób, aby to uzyskać. islice nie przyjmuje negatywnych argumentów, więc idealnie iterable ma specjalną metodę __reversed__ - którą ma Lista - więc musisz najpierw przekazać swoją listę (lub iterable z __reversed__) do reversed.

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

Islice pozwala na leniwą ocenę potoku danych, więc aby zmaterializować dane, przekaż je do konstruktora (jak list):

>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]
 64
Author: Aaron Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 18:03:19

Ostatnie 9 elementów można odczytać od lewej do prawej używając numlist [-9:], lub od prawej do lewej używając numlist [: -10: -1], jak chcesz.

>>> 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]
 41
Author: Nikwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-15 04:27:16

Oto kilka opcji, aby uzyskać "ogon" elementów iterable:

Given

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

Pożądane Wyjście

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

Kod

Otrzymujemy to ostatnie wyjście używając jednej z następujących opcji:

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

Szczegóły

  • A. tradycyjny Python krojenie jest nieodłącznym elementem języka. Ta opcja działa z sekwencjami , takimi jak łańcuchy, listy i krotki. Jednak tego rodzaju krojenie nie działa na iteratorach , np. iter(iterable).
  • B. An itertools przepis . Uogólnia się pracę nad dowolną iteracją i rozwiązuje problem iteratora w ostatnim rozwiązaniu. Przepis ten musi być zaimplementowany ręcznie, ponieważ nie jest oficjalnie zawarty w module itertools.
  • C. wiele receptur, w tym to drugie narzędzie (B), zostało wygodnie zaimplementowanych w pakietach innych firm. Instalowanie i importowanie tych bibliotek eliminuje ręczną implementację. Jedną z tych bibliotek nazywa się more_itertools (install via > pip install more-itertools); Zobacz more_itertools.tail.
  • D. członek itertools biblioteki. Uwaga, itertools.islice nie obsługuje negatywnego krojenia .
  • E. w more_itertools zaimplementowano inne narzędzie, które uogólnia itertools.islice w celu wsparcia negatywnego krojenia; zobacz more_itertools.islice_extended.

którego użyć?

to zależy . W większości przypadków krojenie (opcja A, jak wspomniano w innych odpowiedziach) jest najprostszą opcją ponieważ jest wbudowany w Język i obsługuje większość typów iteracyjnych. W przypadku bardziej ogólnych iteratorów użyj dowolnej z pozostałych opcji. Uwaga, opcje C i E wymagają zainstalowania biblioteki innej firmy, która może być przydatna dla niektórych użytkowników.

 6
Author: pylang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-09 19:41:58