Python'da bir listenin son öğelerini nasıl alabilirim?


Yanıtlar:


519

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


11
Not -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 []
nekketsuuu

93

negatif bir dizin listenin sonundan itibaren sayılır, bu nedenle:

num_list[-9:]

53

Dilimleme

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)

Açıklama:

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

Dilimlerinize açıklayıcı bir ad verin!

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]

islice

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

Zihinsel kısaltmanız çok faydalı
Swanky Coder

40

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]

6

İş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

  • A. Geleneksel Python dilimleme dilin doğasında vardır. Bu seçenek , dizeler, listeler ve tuples gibi dizilerle çalışır . Ancak, bu tür dilimleme yineleyiciler üzerinde çalışmaz , ör iter(iterable).
  • B. Bir 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 .
  • C. İkinci araç (B) dahil olmak üzere birçok tarif, üçüncü taraf paketlerinde rahatlıkla uygulanmıştır. Bu kitaplıkların yüklenmesi ve içe aktarılması, manuel uygulamayı engeller. Bu kütüphanelerden birine more_itertools(üzerinden yükleme > pip install more-itertools) denir ; bakın more_itertools.tail.
  • D. itertoolsKütüphanenin bir üyesi . Dikkat, itertools.islice negatif dilimlemeyi desteklemez .
  • E. Negatif dilimlemeyi desteklemek 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.