किसी सूची का अंतिम तत्व प्राप्त करना


2060

पायथन में, आपको किसी सूची का अंतिम तत्व कैसे मिलता है?

जवाबों:


3098

some_list[-1] सबसे छोटा और सबसे पाइथोनिक है।

वास्तव में, आप इस सिंटैक्स के साथ बहुत कुछ कर सकते हैं। some_list[-n]वाक्य रचना वें करने वाली अंतिम तत्व हो जाता है। तो some_list[-1]अंतिम तत्व प्राप्त करता है, some_list[-2]दूसरे से अंतिम तक जाता है, आदि, नीचे सभी तरह से some_list[-len(some_list)], जो आपको पहला तत्व देता है।

आप इस तरह से सूची तत्व भी सेट कर सकते हैं। उदाहरण के लिए:

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

ध्यान दें कि IndexErrorयदि कोई अपेक्षित आइटम मौजूद नहीं है, तो इंडेक्स द्वारा एक सूची आइटम प्राप्त करना । इसका मतलब है कि खाली होने पर some_list[-1]कोई अपवाद नहीं उठाया जाएगा some_list, क्योंकि खाली सूची में अंतिम तत्व नहीं हो सकता है।


6
मुझे कुछ याद आता है some_list.last- यह कोड की खूबसूरत लाइन होगी
दिमित्री पी।

256

यदि आपकी str()या list()वस्तुएं समाप्त हो सकती हैं, तो खाली होना चाहिए: astr = ''या alist = []फिर, आप वस्तु "साम्य" के alist[-1:]बजाय उपयोग करना चाह सकते हैं alist[-1]

इसका महत्व यह है:

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

जहाँ यह भेद किया जा रहा है कि खाली सूची ऑब्जेक्ट या खाली str ऑब्जेक्ट को वापस करना अधिक "अंतिम तत्व" है-फिर एक अपवाद वस्तु।


25
नीचा दिखाया गया क्योंकि मुझे लगता है कि इस उत्तर का मूल गलत है। एक सूची प्राप्त करना जब आप एक तत्व चाहते हैं केवल अपरिहार्य "सूची सूचकांक को सीमा से बाहर" - और एक खाली सूची से एक तत्व प्राप्त करने का प्रयास करते समय यही होना चाहिए। स्ट्रिंग्स एस्ट्रस [-1:] के लिए एक वैध तरीका हो सकता है क्योंकि यह उसी तरह का रिटर्न देता है जैसे एस्ट्र [-1], लेकिन मुझे नहीं लगता कि ':' खाली सूचियों से निपटने में मदद करता है (और सवाल सूचियों के बारे में है) । यदि विचार "एलिस्ट [-1:]" को "लेन (एलिस्ट)> 0" के बजाय एक सशर्त के रूप में उपयोग करना है, तो मुझे लगता है कि यह बाद में उपयोग करने के लिए बहुत अधिक पठनीय है। (अगर मैं कुछ चूक गया तो
उत्थान के

9
आप नीचे हैं वोट समझ और वैध है। हालांकि मुझे लगता है कि अपवाद वस्तुओं का क्या उद्देश्य है, इस पर दो बुनियादी शिविर हैं। एक निश्चितता यह है कि अपवाद आपके ऐप को रोकते हैं। एक शिविर के प्रयास खंड में अपवादों का उपयोग करता है, क्योंकि दूसरा शिविर इसके बजाय संरचना का उपयोग करेगा। किसी भी घटना में, अपवाद ऐसी वस्तुएं हैं जो आपके कोड को रोकती हैं। और जैसा कि मेरे लिए कम अनुक्रम वस्तु है जैसे कि फिर "अशक्त" परिणाम लौटाए गए जो आपके कोड को रोकते नहीं हैं। मेरी प्राथमिकता उन वस्तुओं के बजाय "नल" वस्तुओं का परीक्षण करने के लिए IF क्लाज का उपयोग करना है जो मेरे कोड को रोकते हैं जो मैं एक प्रयास खंड के साथ आता हूं।
देवपाल 20

6
अपवित्र क्योंकि स्लाइस सिंटैक्स चर्चा के लायक है, हालांकि मैं @StanKurdziel से सहमत हूं कि आकृति विज्ञान गलत है, आप सिर्फ गोलपोस्ट को आगे बढ़ा रहे हैं - मैंने पाया कि मेरा खुद का समाधान प्राथमिक उपयोग से संबंधित था, इसे सूची में जोड़ें अगर आपने नहीं किया 't पहले से ही इसे जोड़ें' (डेल्टा लाइन ग्राफ), इसलिए संयुक्त अभिव्यक्ति if len(my_vector) == 0 or my_vector[-1] != update_valएक व्यावहारिक पैटर्न है। लेकिन यह निश्चित रूप से एक वैश्विक समाधान नहीं है - यह एक वाक्यविन्यास रूप होना अच्छा होगा जहां कोई भी परिणाम नहीं था
मार्क मुलिन

17
xs[-1] if xs else None
गेब्रियल

2
क्यों आप एक IndexError से "बचेंगे"? यदि आप किसी रिक्त सूची या स्ट्रिंग को अनुक्रमित करने का प्रयास करते हैं, तो आपको एक अपवाद मिलेगा। यदि आप उस अपवाद को संभालना चाहते हैं, तो एक कोशिश / छोड़कर का उपयोग करें - यही वह है जिसके लिए यह है।
क्रिस जॉनसन

93

आप भी कर सकते हैं:

alist.pop()

यह इस बात पर निर्भर करता है कि आप अपनी सूची के साथ क्या करना चाहते हैं क्योंकि pop()विधि अंतिम तत्व को हटा देगी।


70

अजगर में अंतिम तत्व प्रदर्शित करने का सबसे सरल तरीका है

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

इस तरह के लक्ष्य को प्राप्त करने के लिए कई अन्य तरीके हैं लेकिन ये उपयोग करने के लिए कम और मीठे हैं।


2
यदि आपकी सूची की लंबाई शून्य है, तो यह समाधान काम list[-1]करेगा जबकि त्रुटि होगी।
अनोन 01

क्या? क्यों आप क्या करेंगे a[-1:][0] सब पर ? वह a[-1]वैसे भी प्रदान करता है। कृपया स्पष्टीकरण दें?
कबूल

51

पायथन में, आपको किसी सूची का अंतिम तत्व कैसे मिलता है?

केवल अंतिम तत्व प्राप्त करने के लिए,

  • सूची को संशोधित किए बिना, और
  • यह मानते हुए कि सूची में एक अंतिम तत्व है (अर्थात यह गैर-रिक्त है)

-1सबस्क्रिप्ट नोटेशन पास करें:

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

व्याख्या

सूचकांक और स्लाइस नकारात्मक पूर्णांक को तर्क के रूप में ले सकते हैं।

मैंने दस्तावेज़ीकरण से एक उदाहरण को संशोधित करने के लिए संकेत दिया है कि प्रत्येक अनुक्रम में कौन सा आइटम है, इस मामले में, स्ट्रिंग में "Python", -1अंतिम तत्व, चरित्र को संदर्भित करता है 'n':

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

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

पुनरावृत्ति unpacking के माध्यम से असाइनमेंट

यह विधि अनावश्यक रूप से सिर्फ अंतिम तत्व प्राप्त करने के उद्देश्य से दूसरी सूची तैयार कर सकती है, लेकिन पूर्णता के लिए (और क्योंकि यह किसी भी चलने योग्य का समर्थन करता है - न केवल सूचियों के लिए)

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

चर नाम, सिर अनावश्यक नव निर्मित सूची के लिए बाध्य है:

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

यदि आप उस सूची के साथ कुछ भी नहीं करने का इरादा रखते हैं, तो यह अधिक एप्रोपोस होगा:

*_, last = a_list

या, वास्तव में, यदि आप जानते हैं कि यह एक सूची है (या कम से कम सबस्क्रिप्ट नोटेशन स्वीकार करता है):

last = a_list[-1]

एक समारोह में

एक टिप्पणीकार ने कहा:

काश पायथन के पास पहले () और आखिरी () के लिए एक फ़ंक्शन होता, जैसे लिस्प करता है ... यह बहुत सारे अनावश्यक लंबोदर कार्यों से छुटकारा दिलाता है।

ये परिभाषित करने के लिए काफी सरल होगा:

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

def first(a_list):
    return a_list[0]

या उपयोग करें operator.itemgetter:

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

किसी भी स्थिति में:

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

विशेष स्थितियां

यदि आप कुछ अधिक जटिल कर रहे हैं, तो आपको अंतिम तत्व को थोड़े अलग तरीकों से प्राप्त करने के लिए अधिक प्रदर्शनकारी लग सकता है।

यदि आप प्रोग्रामिंग में नए हैं, तो आपको इस अनुभाग से बचना चाहिए, क्योंकि यह जोड़े अन्यथा शब्दार्थ के अलग-अलग हिस्सों को एक साथ जोड़ते हैं। यदि आप अपने एल्गोरिथ्म को एक स्थान पर बदलते हैं, तो कोड की एक अन्य पंक्ति पर इसका अनपेक्षित प्रभाव पड़ सकता है।

मैं पूरी तरह से मैं कर सकता हूँ के रूप में caveats और शर्तों को प्रदान करने की कोशिश, लेकिन मैं कुछ याद किया हो सकता है। कृपया टिप्पणी करें यदि आपको लगता है कि मैं एक चेतावनी छोड़ रहा हूं।

टुकड़ा करने की क्रिया

सूची का एक टुकड़ा एक नई सूची देता है - इसलिए हम -1 से अंत तक टुकड़ा कर सकते हैं यदि हम एक नई सूची में तत्व चाहते हैं:

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

यदि सूची खाली है तो यह विफल होने का उल्टा है:

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

जबकि अनुक्रमणिका द्वारा उपयोग करने का प्रयास उठता है IndexErrorजिसे संभालने की आवश्यकता होगी:

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

लेकिन फिर, इस उद्देश्य के लिए स्लाइसिंग केवल तभी की जानी चाहिए जब आपको आवश्यकता हो:

  • एक नई सूची बनाई गई
  • और नई सूची खाली हो अगर पूर्व सूची खाली थी।

for छोरों

पायथन की एक विशेषता के रूप में, forलूप में कोई आंतरिक स्कूपिंग नहीं है ।

यदि आप पहले से ही सूची पर पूर्ण पुनरावृत्ति कर रहे हैं, तो अंतिम तत्व को अभी भी लूप में निर्दिष्ट चर नाम से संदर्भित किया जाएगा:

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

यह सूची में अंतिम रूप से शब्द नहीं है। यह शब्दार्थ है कि आखिरी चीज, जिसका नाम itemथा, के लिए बाध्य था।

>>> 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'

इस प्रकार इसका उपयोग केवल अंतिम तत्व प्राप्त करने के लिए किया जाना चाहिए

  • पहले से ही लूपिंग हैं, और
  • आपको पता है कि लूप खत्म हो जाएगा (त्रुटियों के कारण टूटना या बाहर निकलना नहीं), अन्यथा यह लूप द्वारा संदर्भित अंतिम तत्व को इंगित करेगा।

इसे प्राप्त करना और हटाना

हम अंतिम तत्व को हटाकर और वापस करके हमारी मूल सूची को भी बदल सकते हैं:

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

लेकिन अब मूल सूची को संशोधित किया गया है।

( -1वास्तव में डिफ़ॉल्ट तर्क है, इसलिए list.popइसका उपयोग सूचकांक तर्क के बिना किया जा सकता है):

>>> a_list.pop()
'two'

केवल अगर यह

  • आप जानते हैं कि सूची में इसके तत्व हैं, या अपवाद को संभालने के लिए तैयार हैं यदि यह खाली है, और
  • आप सूची से अंतिम तत्व को निकालने का इरादा रखते हैं, इसे स्टैक की तरह मानते हैं।

ये मान्य उपयोग के मामले हैं, लेकिन बहुत आम नहीं हैं।

बाद के लिए शेष रिवर्स की बचत:

मुझे नहीं पता कि आप ऐसा क्यों करेंगे, लेकिन पूर्णता के लिए, चूंकि reversedएक पुनरावृत्तिकर्ता (जो पुनरावृत्त प्रोटोकॉल का समर्थन करता है) आप इसके परिणाम को पास कर सकते हैं next:

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

तो यह इसके विपरीत करने जैसा है:

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

लेकिन मैं ऐसा करने के लिए एक अच्छे कारण के बारे में नहीं सोच सकता, जब तक कि आपको बाद में रिवर्स इटरेटर के बाकी हिस्सों की आवश्यकता नहीं होगी, जो संभवतः इस तरह दिखाई देगा:

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

use_later = list(reverse_iterator)

और अब:

>>> use_later
[2, 1]
>>> last_element
3

13

इसे रोकने के लिए IndexError: list index out of range, इस सिंटैक्स का उपयोग करें:

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'


10

lst[-1]सबसे अच्छा तरीका है, लेकिन सामान्य पुनरावृत्तियों के साथ, विचार करें more_itertools.last:

कोड

import more_itertools as mit


mit.last([0, 1, 2, 3])
# 3

mit.last(iter([1, 2, 3]))
# 3

mit.last([], "some default")
# 'some default'

6

list[-1]सूची को बदले बिना सूची के अंतिम तत्व को पुनः प्राप्त करेगा। list.pop()सूची के अंतिम तत्व को पुनः प्राप्त करेगा, लेकिन यह मूल सूची को बदल / बदल देगा। आमतौर पर, मूल सूची को बदलने की अनुशंसा नहीं की जाती है।

वैकल्पिक रूप से, यदि, किसी कारण से, आप कुछ कम पायथोनिक की तलाश कर रहे हैं, तो आप उपयोग कर सकते हैं list[len(list)-1], यह मानते हुए कि सूची खाली नहीं है।


2
शायद यह मान लेना बुरा है कि मूल सूची को बदलना आमतौर पर अनुशंसित नहीं है, क्योंकि, आखिरकार, यह बहुत ही सामान्य रूप से किया जाता है
आरोन

6

सूची खाली होने पर आप IndexError प्राप्त नहीं करना चाहते हैं, तो आप नीचे दिए गए कोड का भी उपयोग कर सकते हैं।

next(reversed(some_list), None)

4

ठीक है, लेकिन लगभग हर भाषा में क्या आम है items[len(items) - 1]? यह IMO अंतिम तत्व प्राप्त करने का सबसे आसान तरीका है, क्योंकि इसमें किसी भी तरह के पाइथोनिक ज्ञान की आवश्यकता नहीं होती है ।


3
आइटम [लेन (आइटम) - 1] अनिवार्य रूप से पायथन हुड के तहत क्या कर रहा है, लेकिन चूंकि अनुक्रम का लेन पहले से ही अनुक्रम में संग्रहीत है, इसलिए इसे गिनने की कोई आवश्यकता नहीं है, आप आवश्यक से अधिक काम बना रहे हैं।
डैन गेल

21
जब से तुम अजगर लिख रहे हैं, क्या तुम सच में pythonic अधिक होने की कोशिश करनी चाहिए
माइकल वू

5
@MichaelWu ऐसा करने का कोई अर्थ नहीं है। पाइथोनिक तरीका अक्सर आत्म-व्याख्यात्मक नहीं होता है, अधिक ध्यान देने की आवश्यकता होती है जहां आपको परियोजना के लिए नए व्यक्तियों को पेश करना पड़ता है और निश्चित रूप से, जब आप जावा जैसी अन्य भाषाओं में स्विच करने के लिए काम नहीं करेंगे - तो आप पाइथन विशिष्ट ज्ञान का उपयोग नहीं कर सकते। जब आप संभव के रूप में pythonic रास्ते से बाहर निकलते हैं, तो महीनों / वर्षों के बाद परियोजना पर वापस जाना बहुत आसान होता है।
Radek Anuszewski

7
@Pneumokok आप बिंदु बनाते हैं, लेकिन मैं यह कहना चाहूंगा कि जेनरेटर्स की तुलना में सूची अनुक्रमण एक बहुत ही बुनियादी पायथन तकनीक है। इसके अलावा, यदि आप व्यक्तिगत भाषा टूल और सिंटैक्स का लाभ नहीं लेने जा रहे हैं, तो C या शायद जावास्क्रिप्ट के अलावा किसी और चीज़ का उपयोग करने की जहमत क्यों उठाएं? फिर आप अपने सभी प्रोजेक्ट्स में लगातार हर तरह से कठिन काम कर सकते हैं।
मैथ्यू पर्डन

हालाँकि यह बहुत ज्यादा अजीब नहीं है लेकिन मुझे लगता है कि यह कुछ मामलों में some_list[-1]दृष्टिकोण से बेहतर है क्योंकि यह अधिक तार्किक है, और दिखाता है कि यह वास्तव some_list[-1]में मेरे विचार से बेहतर क्या है ।
बायरन फाइलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.