क्या पहले तत्व में एक सूची को अनपैक करने का एक पाइथोनिक तरीका है और एक एकल कमांड में "पूंछ" है?
उदाहरण के लिए:
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
क्या पहले तत्व में एक सूची को अनपैक करने का एक पाइथोनिक तरीका है और एक एकल कमांड में "पूंछ" है?
उदाहरण के लिए:
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
जवाबों:
पायथन 3.x के तहत, आप इसे अच्छी तरह से कर सकते हैं:
>>> head, *tail = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
3.x में एक नई सुविधा *
ऑपरेटर को अनपैक करने में उपयोग करना है , जिसका अर्थ है कि कोई अतिरिक्त मान। यह पीईपी 3132 में वर्णित है - विस्तारित Iterable अनपैकिंग । यह भी अनुक्रमों ही नहीं, किसी भी चलने पर काम करने का लाभ है।
यह वास्तव में पठनीय भी है ।
पीईपी में वर्णित है, यदि आप 2.x के तहत समकक्ष करना चाहते हैं (संभावित रूप से एक अस्थायी सूची बनाए बिना), तो आपको यह करना होगा:
it = iter(iterable)
head, tail = next(it), list(it)
जैसा कि टिप्पणियों में उल्लेख किया गया है, यह head
अपवाद को फेंकने के बजाय डिफ़ॉल्ट मान प्राप्त करने का अवसर भी प्रदान करता है। यदि आप इस व्यवहार को चाहते हैं next()
, तो डिफ़ॉल्ट मान के साथ एक वैकल्पिक दूसरा तर्क लेता है, इसलिए यदि कोई मुख्य तत्व नहीं था , तो next(it, None)
आपको देगा None
।
स्वाभाविक रूप से, यदि आप किसी सूची पर काम कर रहे हैं, तो 3.x सिंटैक्स के बिना सबसे आसान तरीका है:
head, tail = seq[0], seq[1:]
__getitem__
/ कर सकता है __setitem__
, लेकिन अंतर्निहित सूची में नहीं है।
python 3.x
ओ (1) head,tail
ऑपरेशन की जटिलता के लिए आपको deque
हालांकि उपयोग करना चाहिए ।
निम्नलिखित तरीके से:
from collections import deque
l = deque([1,2,3,4,5,6,7,8,9])
head, tail = l.popleft(), l
यह उपयोगी है जब आपको सूची के सभी तत्वों के माध्यम से पुनरावृत्त करना होगा। उदाहरण के लिए, भोले विलय में 2 विभाजन विलय के प्रकार में।
head, tail = l.popleft(), l
~ O (1) है। head, tail = seq[0], seq[1:]
है ओ (एन)।
head = l.popleft()
और tail
सिर्फ एक उपनाम है l
। अगर l
बदलाव tail
भी आए।
पैंथन 2, लैम्ब्डा का उपयोग कर
>>> head, tail = (lambda lst: (lst[0], lst[1:]))([1, 1, 2, 3, 5, 8, 13, 21, 34, 55])
>>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
head, tail = lst[0], lst[1:]
? यदि ओपी का अर्थ शाब्दिक उपयोग करना है तो वह सिर और पूंछ को मैन्युअल रूप से विभाजित कर सकता हैhead, tail = 1, [1, 2, 3, 5, 8, 13, 21, 34, 55]
lst = ...
पिछली पंक्ति में नहीं )। (२) कर head, tail = lst[0], lst[1:]
कोड साइड-इफेक्ट्स (विचार head, tail = get_list()[0], get_list()[1:]
) के लिए खुला छोड़ देता है , और Op के फॉर्म से अलग होता है head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
।
@GarethLatty से पायथन 2 समाधान पर निर्माण, पायथन 2 में मध्यवर्ती चर के बिना एक पंक्ति के बराबर प्राप्त करने का एक तरीका है।
t=iter([1, 1, 2, 3, 5, 8, 13, 21, 34, 55]);h,t = [(h,list(t)) for h in t][0]
यदि आपको अपवाद-प्रमाण होना चाहिए (अर्थात खाली सूची का समर्थन करना), तो जोड़ें:
t=iter([]);h,t = ([(h,list(t)) for h in t]+[(None,[])])[0]
यदि आप इसे अर्धविराम के बिना करना चाहते हैं, तो उपयोग करें:
h,t = ([(h,list(t)) for t in [iter([1,2,3,4])] for h in t]+[(None,[])])[0]