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]
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:]
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:]
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]
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]
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 moduleitertools
. - 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
); Zobaczmore_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ólniaitertools.islice
w celu wsparcia negatywnego krojenia; zobaczmore_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.
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