একটি তালিকার শেষ উপাদান প্রাপ্তি


2059

পাইথনে, আপনি কীভাবে তালিকার শেষ উপাদানটি পাবেন?

উত্তর:


3097

some_list[-1] সংক্ষিপ্ততম এবং সর্বাধিক পাইথোনিক।

আসলে, আপনি এই বাক্য গঠনটি দিয়ে আরও অনেক কিছু করতে পারেন। some_list[-n]সিনট্যাক্স 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, কারণ খালি তালিকায় কোনও শেষ উপাদান থাকতে পারে না।


5
আমি এরকম কিছু মিস করছি 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

পার্থক্যটি যেখানে করা হচ্ছে তা হ'ল একটি খালি তালিকার অবজেক্ট বা খালি স্টার অবজেক্টকে ফিরিয়ে দেওয়া আরও "শেষ উপাদান" - এর পরে একটি ব্যতিক্রম বস্তুর মতো।


25
ডাউনভোটেড কারণ আমি মনে করি যে এই উত্তরটির মূলটি ভুল। যখন আপনি কোনও উপাদান চান তখন একটি তালিকা পাওয়া অনিবার্য "তালিকা সূচকের সীমা ছাড়াই" স্থগিত করে - এবং খালি তালিকা থেকে কোনও উপাদান পাওয়ার চেষ্টা করার সময় এমনটি হওয়া উচিত। স্ট্রিংস অ্যাস্ট্রির জন্য [-1:] বৈধ পন্থা হতে পারে যেহেতু এটি অ্যাস্ট্রির মতো একই ধরণের [-1] প্রদান করে তবে আমি মনে করি না: ':' খালি তালিকা মোকাবেলা করতে সহায়তা করে (এবং প্রশ্নটি তালিকাগুলির বিষয়ে) । যদি ধারণাটি "লেইন (অ্যালিস্ট)> 0" এর পরিবর্তে "আলিস্ট [-1:]" শর্তসাপেক্ষ হিসাবে ব্যবহার করা হয়, তবে আমি মনে করি এটি পরে ব্যবহার করা আরও অনেক বেশি পাঠযোগ্য। (আমি যদি কিছু মিস করি তবে উজ্জ্বল হয়ে খুশি)
স্টান কুর্দিজিল

9
আপনার ডাউন ভোটটি বোধগম্য এবং বৈধ। তবে আমি দেখতে পাচ্ছি যে দুটি ব্যতিক্রমী অবজেক্ট কীসের উদ্দেশ্যে তৈরি করা হয়েছে সে সম্পর্কে দুটি প্রাথমিক শিবির রয়েছে। একটি নির্দিষ্টতা ব্যতিক্রমগুলি আপনার অ্যাপ্লিকেশনটিকে থামিয়ে দেয় ha একটি শিবির চেষ্টা ক্লজে ব্যাতিক্রম ব্যবহার করে কারণ অন্য শিবির পরিবর্তে যদি লেন (অল্টিস্ট)> 0: কাঠামোটি ব্যবহার করে। যে কোনও ইভেন্টে ব্যতিক্রম হ'ল এমন সামগ্রী যা আপনার কোডটি থামায়। এবং আমার কাছে যেমন কম সিকোয়েন্স অবজেক্ট হয় তারপরে "নাল" ফেরত দেওয়ার মতো ফলাফল - যা আপনার কোডটি থামায় না। আমার পছন্দ হ'ল আইফ ক্লজগুলি আইটেমগুলির পরিবর্তে "নাল" অবজেক্টগুলির জন্য পরীক্ষা করার জন্য যা আমার কোডটি থামিয়ে দেয় যা আমি চেষ্টা করার ধারা দিয়ে প্রিম্প্ট করি।
দেবপ্লেয়ার

6
উত্সাহিত কারণ স্লাইস সিনট্যাক্সটি আলোচনার যোগ্য, তবে আমি @ স্ট্যানকুরডজিলের সাথে একমত যে মরফোলজিটি ভুল, আপনি কেবল গোলপোস্টটি সরিয়ে নিয়েছেন - আমি খুঁজে পেলাম যে আমার নিজের সমাধানটি 'তালিকায় এটি যুক্ত করার প্রাথমিক ব্যবহারের সাথে সম্পর্কিত ছিল যদি আপনি না করেন তবে এটি ইতিমধ্যে যুক্ত করবেন না '(ডেল্টা লাইন গ্রাফ), সুতরাং সম্মিলিত এক্সপ্রেশনটি if len(my_vector) == 0 or my_vector[-1] != update_valএকটি কার্যক্ষম বিন্যাস। তবে এটি অবশ্যই কোনও বিশ্বব্যাপী সমাধান নয় - একটি সিনট্যাক্স ফর্মটি পাওয়া ভাল লাগবে যেখানে ফলাফল কিছুই ছিল না
মার্ক মুলিন

17
xs[-1] if xs else None
গ্যাব্রিয়েল

2
আপনি কেন একটি সূচিপত্রকে "এড়িয়ে" যাবেন? যদি আপনি একটি খালি তালিকা বা স্ট্রিংকে সূচী করার চেষ্টা করেন তবে আপনি একটি ব্যতিক্রম পাবেন। আপনি যদি এই ব্যতিক্রমটি পরিচালনা করতে চান তবে চেষ্টা করুন / বাদে - এটির জন্য এটিই।
ক্রিস জনসন

93

আপনি এটি করতে পারেন:

alist.pop()

এটি আপনার তালিকার সাথে আপনি কী করতে চান তার উপর নির্ভর করে কারণ pop()পদ্ধতিটি শেষ উপাদানটি মুছবে।


70

পাইথনে শেষ উপাদানটি প্রদর্শনের সহজ উপায় হ'ল

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

এ জাতীয় লক্ষ্য অর্জনের জন্য আরও অনেক পদ্ধতি রয়েছে তবে এগুলি সংক্ষিপ্ত এবং ব্যবহার করতে মধুর।


2
যদি আপনার তালিকার দৈর্ঘ্য শূন্য হয় তবে এই সমাধানটি list[-1]ত্রুটি করার সময় কাজ করে ।
anon01

কি? কেন আপনি কিছু a[-1:][0] করতে হবে ? তিনি a[-1]যাহাই হউক না কেন সরবরাহ করেন। ব্যাখ্যা দয়া করে?
কাবুম

51

পাইথনে, আপনি কীভাবে তালিকার শেষ উপাদানটি পাবেন?

শুধু শেষ উপাদান পেতে,

  • তালিকা পরিবর্তন না করে এবং
  • তোমরা কি জান অভিমানী তালিকা করেছে একটি শেষ উপাদান (যেমন এটা nonempty হয়)

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

পুনরাবৃত্তযোগ্য আনপ্যাকিংয়ের মাধ্যমে অ্যাসাইনমেন্ট

এই পদ্ধতিটি অগত্যা কেবলমাত্র শেষ উপাদানটি অর্জনের উদ্দেশ্যে একটি দ্বিতীয় তালিকা তৈরি করতে পারে তবে সম্পূর্ণতার জন্য (এবং যেহেতু এটি কোনও পুনরাবৃত্তিকে সমর্থন করে - কেবল তালিকা নয়):

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

বিশেষ ক্ষেত্রে

আপনি যদি আরও জটিল কিছু করছেন তবে আপনি কিছুটা ভিন্ন উপায়ে শেষ উপাদানটি পেতে আরও পারফরম্যান্স পেতে পারেন।

আপনি যদি প্রোগ্রামিংয়ে নতুন হন তবে আপনার এই বিভাগটি এড়ানো উচিত, কারণ এটি অন্যথায় অ্যালগরিদমের বিভিন্ন অংশকে একত্রে যুক্ত করে। আপনি যদি এক জায়গায় আপনার অ্যালগরিদম পরিবর্তন করেন তবে কোডের অন্য লাইনে এটির অযৌক্তিক প্রভাব থাকতে পারে।

আমি যথাসম্ভব পুরোপুরি সতর্কতা ও শর্ত সরবরাহ করার চেষ্টা করি তবে আমি কিছু মিস করেছি have আপনি যদি মনে করেন আমি একটি সাবধানবাণী ছেড়ে যাচ্ছি দয়া করে মন্তব্য করুন।

slicing

তালিকার একটি স্লাইস একটি নতুন তালিকা ফেরত দেয় - তাই আমরা যদি একটি নতুন তালিকায় উপাদানটি দেখতে চাই তবে আমরা -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

আপনি নীচের কোডটিও ব্যবহার করতে পারেন, যদি তালিকাটি খালি থাকে তবে আপনি সূচিপত্রটি পেতে চান না।

next(reversed(some_list), None)

4

ঠিক আছে, তবে প্রায় প্রতিটি ভাষার উপায়ে সাধারণ কী items[len(items) - 1]? এটি সর্বশেষ উপাদানটি পাওয়ার সবচেয়ে সহজ উপায় আইএমও, কারণ এর জন্য পাইথোনিক জ্ঞানের কোনও প্রয়োজন হয় না ।


3
আইটেমস [লেন (আইটেম) - 1] মূলত পাইথন হুডের নীচে যা করছে তা হল, তবে যেহেতু একটি সিক্যুয়েন্সের লেনটি ইতিমধ্যে সিকোয়েন্সে সঞ্চিত আছে সেখানে এটি গণনা করার দরকার নেই, আপনি প্রয়োজনের তুলনায় আরও কাজ তৈরি করছেন।
ড্যান গেইল

21
যেহেতু আপনি পাইথন লিখছেন, আপনার সত্যই আরও বেশি পাইথোনিক হওয়ার চেষ্টা করা উচিত
মাইকেল উ

5
@ মিশেলওয়ু এটি করার কোনও বুদ্ধি নেই। পাইথোনিক উপায়টি প্রায়শই স্ব-বর্ণনামূলক নয়, আরও মনোযোগের প্রয়োজন যেখানে আপনাকে নতুন ব্যক্তিকে প্রজেক্টে পরিচয় করিয়ে দিতে হবে এবং অবশ্যই জাভা-র মতো অন্যান্য ভাষায় স্যুইচ করার সময় কাজ করবে না - আপনি পাইথনের নির্দিষ্ট জ্ঞান ব্যবহার করতে পারবেন না। আপনি যখন সম্ভব পাইথোনিক উপায়ে বাদ দিবেন, তখন কয়েক মাস / বছর পরে প্রকল্পে ফিরে আসাও অনেক সহজ।
রাদেক আনুসেজুস্কি

7
@ নিউমোকোক আপনি বক্তব্য রাখেন, তবে আমি যুক্তি দিয়ে বলব যে জেনারেটরগুলির তুলনায় তালিকাকে সূচীকরণ একটি খুব প্রাথমিক পাইথন কৌশল। এছাড়াও, যদি আপনি পৃথক ভাষার সরঞ্জাম এবং বাক্য গঠন ব্যবহার না করে যাচ্ছেন তবে সি বা সম্ভবত জাভাস্ক্রিপ্ট বাদে অন্য কিছু ব্যবহার করতে বিরক্ত করবেন কেন? তারপরে আপনি আপনার সমস্ত প্রকল্পে ধারাবাহিকভাবে কঠোরভাবে সবকিছু করতে পারবেন।
ম্যাথু পারডন

যদিও এটি খুব অযৌক্তিক নয়, আমি মনে করি এটি some_list[-1]পদ্ধতির চেয়ে কিছুটা ক্ষেত্রে ভাল, কারণ এটি আরও যুক্তিযুক্ত, এবং এটি দেখায় যে এটি আসলে some_list[-1]আমার মতের চেয়ে ভাল কি করছে ।
বায়রন ফাইলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.