Ro'yxatning oxirgi elementini qanday olish mumkin?

Pythonda ro'yxatning oxirgi elementini qanday olish mumkin?


person Janusz    schedule 30.05.2009    source manba


Javoblar (18)


some_list[-1] eng qisqa va eng pitonik.

Aslida, siz ushbu sintaksis bilan ko'proq narsani qilishingiz mumkin. some_list[-n] sintaksisi n-oxirgi elementni oladi. Shunday qilib, some_list[-1] oxirgi elementni oladi, some_list[-2] oxirgi elementni oladi va hokazo, some_list[-len(some_list)] gacha, bu sizga birinchi elementni beradi.

Roʻyxat elementlarini ham shu tarzda oʻrnatishingiz mumkin. Masalan; misol uchun:

>>> some_list = [1, 2, 3]
>>> some_list[-1] = 5 # Set the last element
>>> some_list[-2] = 3 # Set the second to last element
>>> some_list
[1, 3, 5]

Esda tutingki, roʻyxat bandini indeks boʻyicha olish IndexError darajasini oshiradi. element mavjud emas. Bu shuni anglatadiki, agar some_list bo'sh bo'lsa, some_list[-1] istisno keltiradi, chunki bo'sh ro'yxatda oxirgi element bo'lishi mumkin emas.

person Sasha Chedygov    schedule 30.05.2009
comment
Men some_list.last kabi narsani sog'indim - bu chiroyli kod qatori bo'lar edi - person Dmitry P.; 20.01.2020

Agar str() yoki list() ob'ektlaringiz bo'sh bo'lib qolishi mumkin bo'lsa: astr = '' yoki alist = [], "bir xillik" ob'ekti uchun alist[-1] o'rniga alist[-1:] dan foydalanishni xohlashingiz mumkin.

Buning ahamiyati:

alist = []
alist[-1]   # will generate an IndexError exception whereas 
alist[-1:]  # will return an empty list
astr = ''
astr[-1]    # will generate an IndexError exception whereas
astr[-1:]   # will return an empty str

Farqi shundaki, bo'sh ro'yxat ob'ektini yoki bo'sh str ob'ektini qaytarish istisno ob'ektiga qaraganda "oxirgi element" ga o'xshaydi.

person DevPlayer    schedule 09.11.2010
comment
Men rad javobini berdim, chunki men bu javobning asosini noto'g'ri deb hisoblayman. Element kerak bo'lganda ro'yxatni olish faqat muqarrar ro'yxat indeksini diapazondan tashqariga qoldiradi - va bo'sh ro'yxatdan element olishga harakat qilganda shunday bo'lishi kerak. Strings uchun astr[-1:] to'g'ri yondashuv bo'lishi mumkin, chunki u astr[-1] bilan bir xil turni qaytaradi, lekin menimcha, ':' bo'sh ro'yxatlar bilan ishlashga yordam bermaydi (va savol ro'yxatlar haqida) . Agar len(alist) › 0 o‘rniga shart sifatida alist[-1:] dan foydalanish g‘oyasi bo‘lsa, menimcha, keyingisini ishlatish ancha qulayroq. (agar biror narsani o'tkazib yuborgan bo'lsam, ovoz berishdan xursandman) - person Stan Kurdziel; 07.06.2015
comment
Sizning rad javobingiz tushunarli va haqiqiydir. Biroq, men istisno ob'ektlar uchun mo'ljallangan ikkita asosiy lager borligini bilaman. Bir narsa shundaki, istisnolar ilovangizni to'xtatadi. Lagerlardan biri try bandlarida istisnolardan foydalanadi, chunki boshqa lager o‘rniga if len(alist)›0: tuzilishini ishlatadi. Har qanday holatda, istisnolar sizning kodingizni to'xtatadigan ob'ektlardir. Va men uchun kodingizni to'xtatmaydigan qaytarilgan null-ketliklar kabi kamroq ketma-ketlik ob'ekti. Mening afzal ko'rganim kodimni to'xtatib qo'yadigan ob'ektlar o'rniga null ob'ektlarni sinab ko'rish uchun IF bandlaridan foydalanishdir. - person DevPlayer; 08.06.2015
comment
Ma'qullangan, chunki tilim sintaksisi muhokamaga arziydi, ammo men @StanKurdziel bilan morfologiya noto'g'ri ekanligiga qo'shilaman, siz shunchaki maqsad ustunini ko'chiryapsiz - men o'z yechimimni "agar buni ro'yxatga qo'shsangiz" asosiy foydalanish bilan bog'liqligini topdim. 'allaqachon uni qo'shmang' (delta chiziqli grafiklar), shuning uchun birlashtirilgan ifoda if len(my_vector) == 0 or my_vector[-1] != update_val ishlaydigan naqshdir. lekin bu, albatta, global yechim emas - natijada hech biri bo'lmagan sintaksis shakliga ega bo'lish yaxshi bo'lar edi. - person Mark Mullin; 05.03.2017
comment
Nima uchun IndexErrordan qochgan bo'lasiz? Agar siz bo'sh ro'yxat yoki qatorni indekslashga harakat qilsangiz, siz istisnoga ega bo'lasiz. Agar siz ushbu istisnoni hal qilmoqchi bo'lsangiz, urinib ko'ring/istisnodan foydalaning -- buning uchun u mavjud. - person Chris Johnson; 01.08.2018

Siz ham qila olasiz:

last_elem = alist.pop()

Bu sizning ro'yxatingiz bilan nima qilishni xohlayotganingizga bog'liq, chunki pop() usuli oxirgi elementni o'chiradi.

person Taurus Olson    schedule 30.05.2009

Pythonda oxirgi elementni ko'rsatishning eng oddiy usuli

>>> list[-1:] # returns indexed value
    [3]
>>> list[-1]  # returns value
    3

Bunday maqsadga erishish uchun ko'plab boshqa usullar mavjud, ammo ulardan foydalanish qisqa va yoqimli.

person Atul Arvind    schedule 20.08.2012
comment
agar sizning ro'yxat uzunligi nolga teng bo'lsa, bu yechim ishlaydi va list[-1] xato qiladi. - person anon01; 15.02.2018

Pythonda ro'yxatning oxirgi elementini qanday olish mumkin?

Faqat oxirgi elementni olish uchun,

  • ro'yxatni o'zgartirmasdan, va
  • ro'yxatning oxirgi elementi borligini bilsangiz (ya'ni, u bo'sh emas)

-1 ni obuna belgisiga o'tkazing:

>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'

Tushuntirish

Indekslar va bo'limlar argument sifatida manfiy butun sonlarni qabul qilishi mumkin.

Har bir indeks ketma-ketlikda qaysi elementni ko'rsatish uchun hujjatlardan misolni o'zgartirdim. havolalar, bu holda, "Python", -1 qatoridagi oxirgi elementga, 'n' belgisiga murojaat qiladi:

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
   0   1   2   3   4   5 
  -6  -5  -4  -3  -2  -1

>>> p = 'Python'
>>> p[-1]
'n'

Takrorlanuvchi ochish orqali topshiriq

Ushbu usul keraksiz ravishda ikkinchi ro'yxatni faqat oxirgi elementni olish uchun amalga oshirishi mumkin, ammo to'liqlik uchun (va har qanday iteratsiyani qo'llab-quvvatlaydi - shunchaki ro'yxatlar emas):

>>> *head, last = a_list
>>> last
'three'

O'zgaruvchining nomi, boshi keraksiz yangi yaratilgan ro'yxatga bog'langan:

>>> head
['zero', 'one', 'two']

Agar siz ushbu ro'yxat bilan hech narsa qilmoqchi bo'lsangiz, bu ko'proq mos keladi:

*_, last = a_list

Yoki, agar siz bu ro'yxat ekanligini bilsangiz (yoki hech bo'lmaganda pastki yozuvni qabul qilsangiz):

last = a_list[-1]

Funktsiyada

Bir sharhlovchi shunday dedi:

Pythonda Lisp singari first() va last() funksiyalari bo‘lishini istardim... u ko‘plab keraksiz lambda funksiyalaridan xalos bo‘lardi.

Bularni aniqlash juda oddiy bo'ladi:

def last(a_list):
    return a_list[-1]

def first(a_list):
    return a_list[0]

Yoki operator.itemgetter dan foydalaning:

>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)

Ikkala holatda ham:

>>> last(a_list)
'three'
>>> first(a_list)
'zero'

Maxsus holatlar

Agar siz murakkabroq ish qilmoqchi bo'lsangiz, oxirgi elementni biroz boshqacha yo'llar bilan olish yanada samaraliroq bo'lishi mumkin.

Agar siz dasturlashda yangi bo'lsangiz, ushbu bo'limdan qochishingiz kerak, chunki u semantik jihatdan algoritmlarning turli qismlarini birlashtiradi. Agar siz algoritmingizni bir joyda o'zgartirsangiz, u boshqa kod qatoriga kutilmagan ta'sir ko'rsatishi mumkin.

Men imkon qadar to'liq ogohlantirish va shartlarni berishga harakat qilaman, lekin men nimanidir o'tkazib yuborgan bo'lishim mumkin. Agar men ogohlantirish qoldiryapman deb o'ylasangiz, iltimos, izoh qoldiring.

Kesish

Ro'yxatning bir bo'lagi yangi ro'yxatni qaytaradi - shuning uchun biz elementni yangi ro'yxatda xohlamoqchi bo'lsak -1 dan oxirigacha bo'laklashimiz mumkin:

>>> a_slice = a_list[-1:]
>>> a_slice
['three']

Ro'yxat bo'sh bo'lsa, bu muvaffaqiyatsizlikka uchramaydi:

>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
...     do_something(tail)

Indeks bo'yicha kirishga urinish IndexError ni ko'taradi, bu bilan ishlash kerak bo'ladi:

>>> empty_list[-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Shunga qaramay, bu maqsadda kesish faqat sizga kerak bo'lganda amalga oshirilishi kerak:

  • yangi ro'yxat yaratildi
  • va oldingi ro'yxat bo'sh bo'lsa, yangi ro'yxat bo'sh bo'ladi.

for halqa

Python-ning o'ziga xos xususiyati sifatida for tsiklida ichki qamrov yo'q.

Agar siz allaqachon ro'yxat bo'yicha to'liq iteratsiyani amalga oshirayotgan bo'lsangiz, oxirgi element hali ham tsiklda tayinlangan o'zgaruvchi nomi bilan havola qilinadi:

>>> def do_something(arg): pass
>>> for item in a_list:
...     do_something(item)
...     
>>> item
'three'

Bu semantik jihatdan ro'yxatdagi oxirgi narsa emas. Bu semantik jihatdan item nomi bog'langan oxirgi narsadir.

>>> def do_something(arg): raise Exception
>>> for item in a_list:
...     do_something(item)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 1, in do_something
Exception
>>> item
'zero'

Shunday qilib, bu faqat oxirgi elementni olish uchun ishlatilishi kerak

  • allaqachon aylanishmoqda va
  • sikl tugashini bilasiz (xatolar tufayli buzilmaydi yoki chiqmaydi), aks holda u tsikl tomonidan havola qilingan oxirgi elementga ishora qiladi.

Uni olish va olib tashlash

Biz, shuningdek, oxirgi elementni olib tashlash va qaytarish orqali asl ro'yxatimizni o'zgartirishimiz mumkin:

>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']

Ammo endi asl ro'yxat o'zgartirildi.

(-1 aslida standart argumentdir, shuning uchun list.pop indeks argumentisiz ishlatilishi mumkin):

>>> a_list.pop()
'two'

Buni faqat agar

  • ro'yxatda elementlar borligini bilasiz yoki agar u bo'sh bo'lsa, istisno bilan ishlashga tayyormisiz va
  • Siz oxirgi elementni ro'yxatdan olib tashlashni, uni stek kabi ko'rib chiqmoqchisiz.

Bu to'g'ri foydalanish holatlari, lekin juda keng tarqalgan emas.

Qolgan teskarisini keyinroq saqlash uchun:

Nega buni qilganingizni bilmayman, lekin toʻliqligi uchun reversediteratorni qaytarganligi uchun (iterator protokolini qoʻllab-quvvatlaydi) uning natijasini next ga oʻtkazishingiz mumkin:

>>> next(reversed([1,2,3]))
3

Shunday qilib, buning teskarisini qilish kabi:

>>> next(iter([1,2,3]))
1

Ammo buni qilish uchun yaxshi sabab topa olmayman, agar sizga keyinroq teskari iteratorning qolgan qismi kerak bo'lmasa, ehtimol u quyidagicha ko'rinadi:

reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)

use_later = list(reverse_iterator)

va hozir:

>>> use_later
[2, 1]
>>> last_element
3
person Aaron Hall    schedule 23.06.2017

IndexError: list index out of range oldini olish uchun ushbu sintaksisdan foydalaning:

mylist = [1, 2, 3, 4]

# With None as default value:
value = mylist and mylist[-1]

# With specified default value (option 1):
value = mylist and mylist[-1] or 'default'

# With specified default value (option 2):
value = mylist[-1] if mylist else 'default'
person Valentin Podkamennyi    schedule 13.04.2019


Boshqa usul:

some_list.reverse() 
some_list[0]
person Sanjay Pradeep    schedule 10.01.2016
comment
Bu oddiy usul boʻlib, O(n) da ham xuddi shunday amalni bajarishingiz mumkin, garchi sizda O(1) da qilish imkoniyati mavjud boʻlsa ham. - person say_my_name; 08.06.2021

list[-1] ro'yxatni o'zgartirmasdan ro'yxatning oxirgi elementini oladi. list.pop() roʻyxatning oxirgi elementini oladi, lekin u asl roʻyxatni oʻzgartiradi/oʻzgartiradi. Odatda, asl ro'yxatni o'zgartirish tavsiya etilmaydi.

Shu bilan bir qatorda, agar siz biron sababga ko'ra kamroq pythonic narsani qidirsangiz, ro'yxat bo'sh emas deb hisoblab, list[len(list)-1] dan foydalanishingiz mumkin.

person Sondering Narcissist    schedule 07.10.2016
comment
Asl ro'yxatni mutatsiyaga kiritish odatda tavsiya etilmaydi deb o'ylash yomon, chunki bu juda tez-tez amalga oshiriladi. - person Aaron; 01.12.2016

Ro'yxat bo'sh bo'lganda IndexErrorni olishni istamasangiz, quyidagi koddan ham foydalanishingiz mumkin.

next(reversed(some_list), None)
person Yavuz Mester    schedule 02.06.2017

Yaxshi, lekin deyarli barcha tillarda umumiy bo'lgan items[len(items) - 1] haqida nima deyish mumkin? Bu oxirgi elementni olishning eng oson usuli IMO, chunki u hech qanday pythonic bilimni talab qilmaydi.

person Radek Anuszewski    schedule 07.10.2015
comment
items[len(items) - 1] aslida Pythonning kaput ostida qiladigan ishi, lekin ketma-ketlikning liniyasi allaqachon ketma-ketlikda saqlanganligi uchun uni hisoblashning hojati yo'q, siz zarur bo'lgandan ko'proq ish yaratasiz. - person Dan Gayle; 10.10.2015
comment
Python-ni yozayotganingiz uchun, siz haqiqatan ham ko'proq Python bo'lishga harakat qilishingiz kerak - person Michael Wu; 27.10.2015
comment
@MichaelWu Buni qilishning ma'nosi yo'q. Pythonik usul ko'pincha o'z-o'zidan tushunarli emas, loyihaga yangi odamlarni kiritish kerak bo'lgan joyda ko'proq e'tibor talab etiladi va, albatta, Java kabi boshqa tillarga o'tish kerak bo'lganda ishlamaydi - siz Python-ga xos bilimlardan foydalana olmaysiz. Iloji boricha pitonik usulni o'tkazib yuborsangiz, oylar/yillardan keyin loyihaga qaytish ham ancha oson bo'ladi. - person Radek Anuszewski; 31.10.2015
comment
@Pneumokok Siz fikr bildirasiz, lekin men ro'yxatni indekslash generatorlar bilan solishtirganda juda asosiy Python texnikasi ekanligini ta'kidlayman. Bundan tashqari, agar siz individual til vositalari va sintaksisdan foydalanmoqchi bo'lmasangiz, nima uchun C yoki javascriptdan boshqa biror narsani ishlatishingiz kerak? Shunda siz barcha loyihalaringizda doimo hamma narsani qiyin yo'l bilan bajarishingiz mumkin. - person Matthew Purdon; 03.12.2015
comment
Bu juda pitonik bo'lmasa-da, menimcha, bu some_list[-1] yondashuvidan ko'ra yaxshiroq, chunki u mantiqiyroq va u aslida nima qilayotganini mening fikrimcha some_list[-1] dan yaxshiroq ko'rsatadi. - person Byron Filer; 05.11.2016
comment
my_test = [] last_item = my_test[len(my_test) - 1] uchun nima bo'ladi. Bu boshqa javoblar kabi IndexError uchun ham istisno qiladi. Garchi men istisnolar to'g'ri va yaxshi deb hisoblayman, chunki men Python-da afzal ko'rgan try:...except:...else:...finally:... kodlash namunasi bilan nima qilishni bilaman. - person Fr0zenFyr; 14.04.2018

Pitonik yo'l

Shunday qilib, bizda a = [1,2,3,4] ro'yxati borligini ko'rib chiqaylik, Python Listda bizga uning bir qismini yoki elementini berish uchun manipulyatsiya qilish mumkin, quyidagi buyruq yordamida oxirgi elementni osongina olish mumkin.

print(a[-1])
person Muneeb Ahmad Khurram    schedule 09.05.2021

Mana sizning so'rovingiz uchun yechim.

a=["first","middle","last"] # A sample list
print(a[0]) #prints the first item in the list because the index of the list always starts from 0.
print(a[-1]) #prints the last item in the list.
print(a[-2]) #prints the last second item in the list.

Chiqish:

>>> first
>>> last
>>> middle
person Code Carbonate    schedule 03.07.2020

IndexError oldini olish uchun: ro'yxat indeksi diapazondan tashqarida, siz ushbu kod qismini ishlatishingiz mumkin.

list_values = [12, 112, 443]

def getLastElement(lst):
    if len(lst) == 0:
        return 0
    else:
        return lst[-1]

print(getLastElement(list_values))
person HASAN HÜSEYİN YÜCEL    schedule 23.03.2021
comment
Ushbu yechim bilan bog'liq muammo shundaki, len(lst) == 0 bo'lsa, siz intni kutayotganingizda satrni qaytaradi. - person raulmd13; 29.03.2021
comment
Tugallangan.......... - person HASAN HÜSEYİN YÜCEL; 29.03.2021
comment
Men aytmoqchi bo'lgan narsa shuki, bu usul berilgan ma'lumotlar turi bilan ishlaydi. Uni barcha turdagi ro'yxatlar uchun ishlatib bo'lmaydi. Lekin yomon javob emas. - person raulmd13; 30.03.2021

Siz shunchaki [-1] indeksini olishingiz va qo'yishingiz kerak bo'ladi. Masalan:

list=[0,1,2]
last_index=list[-1]
print(last_index)

Chiqish sifatida siz 2 ta olasiz.

person AI Nerd    schedule 07.05.2021

Python-dagi ro'yxatdagi oxirgi elementga kirish:

1: salbiy indeksli oxirgi elementga kirish -1

>> data = ['s','t','a','c','k','o','v','e','r','f','l','o','w']
>> data[-1]
'w'

2. Pop() usuli yordamida oxirgi elementga kiring

>> data = ['s','t','a','c','k','o','v','e','r','f','l','o','w']
>> data.pop()
'w'

Biroq, pop usuli oxirgi elementni ro'yxatdan olib tashlaydi.

person Gunjan    schedule 04.06.2021
comment
To'g'ri bo'lsa-da, .pop halokatli (boshqa javoblar bilan aniqlanganidek). U nafaqat ro'yxatdagi oxirgi elementni oladi, balki uni ro'yxatdan ham olib tashlaydi - person Wondercricket; 08.06.2021

Agar siz my_list[-1] ni qilsangiz, bu ro'yxatning oxirgi elementini qaytaradi. Salbiy ketma-ketlik indekslari massiv oxiridan boshlab pozitsiyalarni ifodalaydi. Salbiy indekslash oxiridan boshlanadi degan ma'noni anglatadi, -1 oxirgi elementni anglatadi, -2 ikkinchi-oxirgi bandni anglatadi va hokazo.

person Hadi Mir    schedule 26.12.2020

Bu haqda hech qanday javob topa olmadim. Shunday qilib, qo'shish.

some_list[~0] ni ham sinab ko'rishingiz mumkin.

Bu tilda belgisi

person Underoos    schedule 23.06.2021