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:]
-0olduğ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.copyve list.clearPython 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, Noneilk değişken olarak yorumlanır, böylece, gerekli olan startdeğişken , aksi olurdu stopargüman .
Daha sonra dilim nesnesini sıranıza iletebilirsiniz:
>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]
isliceisliceitertools modülünden bunu elde etmenin başka bir olası yolu. islicenegatif 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).itertoolstarif . 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.itertoolsKütüphanenin bir üyesi . Dikkat, itertools.islice negatif dilimlemeyi desteklemez . more_itertoolsiçin genelleme itertools.isliceyapan 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.