पायथन में एकल-तत्व सूची से केवल तत्व प्राप्त करना?


83

जब एक पायथन लिस्ट में हमेशा एक ही आइटम को जाना जाता है, तो क्या इसके अलावा इसे एक्सेस करने का कोई तरीका है:

mylist[0]

आप पूछ सकते हैं, 'आप क्यों करना चाहेंगे?'। अकेले में जिज्ञासा। पायथन में सब कुछ करने का एक वैकल्पिक तरीका प्रतीत होता है ।


5
विकल्प हो सकते हैं, लेकिन आमतौर पर ऐसा करने का केवल एक स्पष्ट तरीका है - और, इस मामले में, आपको लगता है कि यह पहले ही मिल चुका है।
इखुमोरो

यदि इसमें हमेशा एक ही आइटम होता है, तो शायद एक listसबसे अच्छा डेटा प्रकार नहीं है?
डेविड ज़ेमेंस

13
@ekhumoro: मैं वास्तव में अनुक्रम अनपैकिंग विधि के लिए आंशिक हूं, क्योंकि यह इस धारणा की पुष्टि करता है कि अनुक्रम में केवल एक तत्व है। mylist[0]सफल होता है जब आपके पास कम से कम एक तत्व होता है, लेकिन शिकायत नहीं करता है यदि आपके पास वास्तव में 30 तत्व हैं। singleitem, = mylistपुष्टि करता है कि आपको वास्तव में एक तत्व मिला है, अधिक नहीं, कम नहीं।
शैडो रेंजर

1
@ शादोवरंगेर। प्रश्न स्पष्ट रूप से एक सूची में एकमात्र तत्व तक पहुंचने के बारे में है जो पहले से ही एक आइटम को शामिल करने के लिए जाना जाता है।
इखुमोरो

6
@ekhumoro: कोई असहमति नहीं। मैं सिर्फ रक्षात्मक रूप से कार्यक्रम करना पसंद करता हूं, इसलिए आवश्यकताओं का उल्लंघन चुपचाप नहीं गुजरता (यकीन है कि यह विफल रहता है, लेकिन यह जोर से विफल होता है, जो सूक्ष्म दुर्व्यवहारों की तुलना में पहचानना और ठीक करना बहुत आसान है)। अगर मैं हर बार उत्पादन कोड में कुछ "ज्ञात" व्यवहार के लिए निकल जाता था, तो गलत गलत हो गया ... ठीक है, मैं शायद अमीर नहीं होगा , लेकिन मैं परिवार को वास्तव में अच्छा करने में सक्षम हूं रात का खाना।
शैडो रेंजर

जवाबों:


123

अनुक्रम unpacking:

singleitem, = mylist
# Identical in behavior (byte code produced is the same),
# but arguably more readable since a lone trailing comma could be missed:
[singleitem] = mylist

इटरेटर प्रोटोकॉल का स्पष्ट उपयोग:

singleitem = next(iter(mylist))

विनाशकारी पॉप:

singleitem = mylist.pop()

नकारात्मक सूचकांक:

singleitem = mylist[-1]

एकल पुनरावृत्ति के माध्यम से सेट करें for(क्योंकि लूप चर अपने अंतिम मान के साथ उपलब्ध रहता है जब लूप समाप्त हो जाता है):

for singleitem in mylist: break

कई अन्य (उपरोक्त बिट्स के संयोजन या भिन्नता, या अन्यथा अंतर्निहित पुनरावृत्ति पर निर्भर), लेकिन आपको यह विचार मिलता है।


6
अशिष्टता के कारण मुख्य उत्तर में शामिल किए जाने के योग्य नहीं: एकल तर्क फ़ंक्शन के लिए पैरामीटर्स singleitem = (lambda x: x)(*mylist)
अनपैकिंग

6
पहला जो इसमें अद्वितीय है वह यह भी उठाता है यदि सूची में एक से अधिक तत्व हैं।
नील जी

7
पहले के रूप में भी लिखा जा सकता है [singleitem] = mylist
कार्स्टन एस 10

@ नील: दुख की बात है, यह पूरी तरह से अद्वितीय नहीं है; टिप्पणियों में "बड़े पैमाने पर पागलपन" संस्करण भी ऐसा करता है (जैसा कि सूची सिंटैक्स के माध्यम से अनपैक करता है, हालांकि यह वास्तव में पहले उदाहरण के व्यवहार के समान है)। मुझे अब थोड़ा गंदा लग रहा है।
शैडो रेंजर

1
@ करंट्स: आमतौर पर, मैं सीक्वेंस अनपैकिंग []( for [i, x] in enumerate(iterable):मुझे बैट्टी ड्राइव करता है) के लिए उपयोग करने में विफल रहता हूं , लेकिन हां, एकल मूल्य अनपैक करने के मामले में, अनुगामी अल्पविराम आसानी से छूट सकता है, और ब्रैकेट का उपयोग पठनीयता के कारणों के लिए उचित है। मैंने इसे उत्तर में जोड़ दिया है। धन्यवाद!
शैडो रेंजर

20

मैं more_itertools जोड़ूंगा कि पुस्तकालय में एक उपकरण है जो एक आइटम को पुनरावृत्त से लौटाता है।

from more_itertools import one


iterable = ["foo"]
one(iterable)
# "foo"

इसके अलावा, more_itertools.oneअगर एररबल खाली है या एक से अधिक आइटम हैं , तो एक त्रुटि उठाता है।

iterable = []
one(iterable)
# ValueError: not enough values to unpack (expected 1, got 0)

iterable = ["foo", "bar"]
one(iterable)
# ValueError: too many values to unpack (expected 1)

more_itertools एक तृतीय-पक्ष पैकेज है > pip install more-itertools

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.