Yanıtlar:
Bunun için dilimleme işleciyle negatif tamsayılar kullanabilirsiniz. İşte python CLI yorumlayıcısını kullanan bir örnek:
>>> 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]
önemli çizgi a[-9:]
-0
olduğunu 0
. Yani son sıfır elemanını değil, a[-0:]
bütünü döndürür . Sıfırı korumak için kullanabilirsiniz . a
[]
a[-n:] if n > 0 else []
Python dilimleme inanılmaz derecede hızlı bir işlemdir ve verilerinizin parçalarına hızlı bir şekilde erişmenin kullanışlı bir yoludur.
Bir listeden son dokuz öğeyi (veya dizeyi destekleyen herhangi bir diziyi) almak için dilim gösterimi şöyle görünür:
num_list[-9:]
Bunu gördüğümde, köşeli parantez içindeki parçayı "uçtan uca 9." olarak okudum. (Aslında, bunu zihinsel olarak "-9, açık" olarak kısaltırım)
Tam gösterim
sequence[start:stop:step]
Ancak iki nokta üst üste Python'a normal bir dizin değil, bir dilim verdiğinizi söyler. Bu yüzden Python 2'deki listeleri kopyalamanın deyimsel yolu
list_copy = sequence[:]
Ve onları temizlemek:
del my_list[:]
(Listeler olsun list.copy
ve list.clear
Python 3'te.)
Dilim oluşturmayı list.__getitem__
yöntemden geçirmekten ayırmak yararlı olabilir ( köşeli parantez budur ). Yeni olmasanız bile, kodunuzu daha okunaklı tutar, böylece kodunuzu okumak zorunda kalabilecekler ne yaptığınızı daha kolay anlayabilir.
Ancak, bir değişkene iki nokta üst üste işaretiyle ayrılmış bazı tamsayılar atayamazsınız. Dilim nesnesini kullanmanız gerekir:
last_nine_slice = slice(-9, None)
İkinci bağımsız değişken, None
ilk değişken olarak yorumlanır, böylece, gerekli olan start
değişken , aksi olurdu stop
argüman .
Daha sonra dilim nesnesini sıranıza iletebilirsiniz:
>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]
islice
islice
itertools modülünden bunu elde etmenin başka bir olası yolu. islice
negatif argümanlar almaz, bu yüzden ideal olarak yinelemenizin __reversed__
özel bir yöntemi vardır - hangi listenin sahip olduğu - bu yüzden önce listenizi (veya ile yinelenebilir __reversed__
) iletmeniz gerekir reversed
.
>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>
islice, veri boru hattının tembel olarak değerlendirilmesine izin verir, bu nedenle verileri gerçekleştirmek için bir kurucuya (gibi list
) iletin :
>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]
Son 9 eleman, numlist [-9:] kullanılarak soldan sağa veya numlist [: - 10: -1] kullanılarak sağdan sola okunabilir.
>>> 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]
İşte bir yinelenebilir "kuyruk" öğeleri almak için birkaç seçenek:
verilmiş
n = 9
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Istenilen çıktı
[2, 3, 4, 5, 6, 7, 8, 9, 10]
kod
İkinci çıktıyı aşağıdaki seçeneklerden birini kullanarak alırız:
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))
ayrıntılar
iter(iterable)
.itertools
tarif . Herhangi bir yinelenebilir üzerinde çalışmak genelleştirilir ve son çözümde yineleyici sorununu çözer. Bu tarif, resmi olarak yer almadığı için manuel olarak uygulanmalıdır.itertools
modüle .more_itertools
(üzerinden yükleme > pip install more-itertools
) denir ; bakın more_itertools.tail
.itertools
Kütüphanenin bir üyesi . Dikkat, itertools.islice
negatif dilimlemeyi desteklemez . more_itertools
için genelleme itertools.islice
yapan başka bir araç uygulanmıştır ; bakın more_itertools.islice_extended
.Hangisini kullanacağım?
O bağlıdır . Çoğu durumda, dilimleme (diğer cevaplarda belirtildiği gibi A seçeneği), dilde yerleşik olduğu ve en çok yinelenebilir türleri desteklediği için en basit seçenektir. Daha genel yineleyiciler için, kalan seçeneklerden herhangi birini kullanın. C ve E seçeneklerinde, bazı kullanıcıların faydalı bulabileceği bir üçüncü taraf kitaplığı kurulması gerekir.