क्यों अजगर सूची पॉप है () लेकिन धक्का नहीं ()


265

क्या किसी को पता है कि पायथन के list.appendकार्य को क्यों नहीं कहा list.pushजाता है, जो पहले से ही एक है list.popजो अंतिम तत्व को निकालता है और वापस लौटाता है (जो -1 में अनुक्रमित है) और list.appendशब्दार्थ उस उपयोग के अनुरूप है?


21
<नाइटपिक> यह एक विधि है, एक फ़ंक्शन नहीं है। </ nitpick>
टिम पीटरज़

49
मुझे लगता है कि यह एक बड़ा सवाल है, हालांकि इसे शायद फिर से शुरू किया जाना चाहिए: "क्यों अजगर सूचियों में पॉप () हैं, लेकिन धक्का नहीं ()"।
उड़ी

6
popएक सूची में कहीं से भी आइटम पॉप कर सकते हैं। appendकिसी सूची के बीच में "धक्का" नहीं दे सकते।
एंडोलिथ

@TimPietzcker <nitpick ^ 2> मेथड, वास्तव में, फंक्शन, मेथड (मेम्बर फंक्शन) फंक्शन का सबसेट है :)
jave.web

जवाबों:


246

क्योंकि "अपेंड" का अस्तित्व "पॉप" से बहुत पहले था। 1991 की शुरुआत में पायथन 0.9.1 समर्थित सूची। इस प्रकार, 1997 में पॉप जोड़ने के बारे में comp.lang.python पर चर्चा का एक हिस्सा । गुइडो ने लिखा:

एक स्टैक को लागू करने के लिए, एक सूची में जोड़ना होगा। pop () आदिम (और नहीं, मैं किसी भी सिद्धांत के आधार पर इस विशेष के खिलाफ नहीं हूं)। list.push () list.pop () के साथ समरूपता के लिए जोड़ा जा सकता है, लेकिन मैं एक ही ऑपरेशन के लिए कई नामों का बहुत बड़ा प्रशंसक नहीं हूं - जल्द ही या बाद में आप कोड को पढ़ने जा रहे हैं जो दूसरे का उपयोग करता है, इसलिए आपको दोनों सीखने की ज़रूरत है, जो कि अधिक संज्ञानात्मक भार है।

आप यह भी देख सकते हैं कि वह इस विचार पर चर्चा करता है कि पुश / पॉप / पुट / पुल तत्व में होना चाहिए [0] या तत्व के बाद [-1] जहां वह आइकन की सूची का संदर्भ देता है:

मुझे लगता है कि यह सब सूची ऑब्जेक्ट कार्यान्वयन से सबसे अच्छा बचा है - यदि आपको स्टैक, या कतार की आवश्यकता है, तो विशेष शब्दार्थ के साथ, थोड़ा वर्ग लिखें जो सूचियों का उपयोग करता है

दूसरे शब्दों में, सीधे पायथन सूचियों के रूप में लागू किए गए स्टैक के लिए, जो पहले से ही तेज एपेंड (), और डेल सूची [-1] का समर्थन करता है, यह समझ में आता है कि अंतिम तत्व पर डिफ़ॉल्ट रूप से list.pop () काम करता है। भले ही अन्य भाषाएं इसे अलग तरीके से करें।

यहां निहित यह है कि अधिकांश लोगों को एक सूची में संलग्न करने की आवश्यकता होती है, लेकिन कई लोगों के पास सूचियों को स्टैक के रूप में व्यवहार करने का अवसर होता है, यही कारण है कि सूची.एपेंड बहुत पहले आ गई।


16
@poige you're going to *read* code that uses the other one (...) which is more cognitive loadयाद रखना "कोई धक्का नहीं है" केवल संज्ञानात्मक भार का परिचय देता है जब आप कोड लिख रहे होते हैं। याद रखें "धक्का एपेंड के लिए एक सटीक पर्यायवाची है" संज्ञानात्मक भार का परिचय देता है जब भी आप पढ़ते हैं जिसे आप अक्सर कम इस्तेमाल करते हैं। देखें stackoverflow.com/questions/3455488/... के बारे में क्यों लोगों को लगता है पठनीयता अक्सर श्रेष्ठ माना जाता writeability अधिक के लिए
stevenjackson121

2
किसी भी बहाने / भावना को नहीं बनाता है
poige

15

क्योंकि यह अपील करता है; यह धक्का नहीं है। "लागू करना" एक सूची के अंत में जोड़ता है, "धक्का" सामने जोड़ता है।

एक कतार बनाम एक ढेर के बारे में सोचो।

http://docs.python.org/tutorial/datastructures.html

संपादित करें: मेरे दूसरे वाक्य को और अधिक सटीक रूप से पुन : प्रस्तुत करने के लिए, "लागू करना" बहुत स्पष्ट रूप से अंतर्निहित सूची की परवाह किए बिना किसी सूची के अंत में कुछ जोड़ने का मतलब है । जब एक नया तत्व जुड़ जाता है जब यह "धकेल" कम स्पष्ट होता है। एक स्टैक पर धक्का "शीर्ष" पर कुछ डाल रहा है, लेकिन यह वास्तव में अंतर्निहित डेटा संरचना में कहां जाता है पूरी तरह से कार्यान्वयन पर निर्भर करता है। दूसरी ओर, एक कतार पर धकेलने का अर्थ है इसे अंत तक जोड़ना।


4
ट्यूटोरियल यह सुझाव देता है कि यह अंत से धक्का देता है और चबूतरे करता है: "सूची विधियों में एक स्टैक के रूप में एक सूची का उपयोग करना बहुत आसान है, जहां अंतिम तत्व जोड़ा गया पहला तत्व पुनर्प्राप्त किया गया है (" अंतिम-इन, पहला-आउट ")। स्टैक के शीर्ष पर एक आइटम जोड़ने के लिए, एपेंड का उपयोग करें ()। स्टैक के शीर्ष से एक आइटम को पुनः प्राप्त करने के लिए, एक स्पष्ट सूचकांक के बिना पॉप () का उपयोग करें।"
उरई

110
किसी भी तरह से "धक्का" का अर्थ सामने की तरफ जोड़ना है। स्टैक के हर कार्यान्वयन को कभी भी एक स्टैन के शीर्ष (अंत) पर एक समझदार व्यक्ति द्वारा लिखा गया है, स्टैक के नीचे (प्रारंभ) नहीं
किप

4
सुधार: प्रत्येक * सरणी-आधारित कार्यान्वयन। एक लिंक्ड-लिस्ट कार्यान्वयन सिर पर धक्का होगा।
किप

16
जावास्क्रिप्ट pushअंत में जोड़ता है।
कोबी

2
नहीं, खाते के list.popशब्दार्थ list.appendमें, सूची में तत्वों को धकेलता है, जब एक स्टैक के रूप में देखा जाता है।
किरान

10

क्योंकि यह एक सूची में एक तत्व को जोड़ता है? स्टैक का जिक्र करते समय आमतौर पर पुश का उपयोग किया जाता है।


7
एक सूची हालांकि एक स्टैक हो सकती है। :-)
जेसन बेकर

@JasonBaker आप किसी सूची का उपयोग करके स्टैक को लागू कर सकते हैं, लेकिन इसका अर्थ सूची == स्टैक नहीं है। यदि आप वास्तव में चाहते हैं, तो आप एक कतार का उपयोग करके एक स्टैक भी लागू कर सकते हैं। (यह बहुत ही अयोग्य होगा, लेकिन यह संभव है!)
मार्क ई। हासे

भ्रम वास्तव में इस तथ्य से आता है कि स्टैक में एक सूची की तरह "शुरुआत" या "अंत" नहीं है, बल्कि एक "शीर्ष" और "नीचे" है। स्टैक में जोड़ने से तात्पर्य एक तत्व को शीर्ष पर रखने और नीचे "पुश" करने से है। मोर्चे पर "धक्का" का कोई मतलब नहीं है (कम से कम भाषाई रूप से नहीं)। और चीजों को और भी अधिक भ्रमित करने के लिए, C ++ "push_front" और "push_back" का उपयोग करता है।
जेसप्रे

9

क्योंकि "परिशिष्ट" का अर्थ है "सूची के अंत में जोड़ें"। यदि इसे "पुश" कहा जाता है, तो यह स्पष्ट नहीं होगा कि हम पूंछ पर या सूची के सिर पर सामान जोड़ रहे हैं।


12
इसका कोई मतलब नहीं है क्योंकि एक popऑपरेशन है। के बाद से pushऔर popआम तौर पर ढेर संचालन कर रहे हैं और एक साथ जाना है, यह उम्मीद की जानी चाहिए कि वे सूची का एक ही अंत पर कार्य करते हैं।
jamesdlin

7

किसी भी माध्यम से आधिकारिक जवाब नहीं (केवल भाषा का उपयोग करने के आधार पर एक अनुमान), लेकिन पायथन आपको सूची को स्टैक के रूप में उपयोग करने की अनुमति देता है (उदाहरण के लिए, ट्यूटोरियल का अनुभाग 5.1.1 )। हालांकि, एक सूची अभी भी सबसे पहले एक सूची है, इसलिए ऑपरेशन जो कि स्टैक शर्तों (यानी, धक्का) के बजाय सूची शब्दों (यानी, अपेंड) दोनों का उपयोग करने के लिए सामान्य हैं। चूंकि एक पॉप ऑपरेशन सूची में आम नहीं है (हालांकि 'removeLast' का उपयोग किया जा सकता था), उन्होंने एक पॉप () को परिभाषित किया लेकिन एक धक्का नहीं ()।


3

ठीक है, यहाँ व्यक्तिगत राय है, लेकिन एक सेट में एपेंड और प्रेपेंड सटीक स्थिति दर्शाते हैं।

पुश एंड पॉप वास्तव में अवधारणाएं हैं जिन्हें किसी सेट के दोनों छोर पर लागू किया जा सकता है ... जब तक आप सुसंगत हैं ... किसी कारण से, मेरे लिए, पुश () ऐसा लगता है कि इसे एक के सामने लागू होना चाहिए सेट...


3
चूँकि आप इसे ऊपर लाए हैं, यदि सरणियों में एक .append () फ़ंक्शन है, तो फिर कोई संबंधित नहीं है। ' मैं .inser (0, वैल) का उपयोग करना सीख सकता हूं, लेकिन फिर इसी .delete (पॉस, वैल) फ़ंक्शन की कमी से शर्मिंदा हूं। Ref: docs.python.org/2/library/array.html
MarkHu

3

FYI करें, एक पुश विधि वाली सूची बनाना बहुत कठिन नहीं है:

>>> class StackList(list):
...     def push(self, item):
...             self.append(item)
... 
>>> x = StackList([1,2,3])
>>> x
[1, 2, 3]
>>> x.push(4)
>>> x
[1, 2, 3, 4]

एक स्टैक कुछ हद तक सार है। "धक्का" और "पॉपिंग" का विचार काफी हद तक स्वतंत्र है कि स्टैक वास्तव में कैसे लागू किया जाता है। उदाहरण के लिए, आप सैद्धांतिक रूप से इस तरह से एक स्टैक लागू कर सकते हैं (हालांकि मुझे नहीं पता कि आप क्यों करेंगे):

l = [1,2,3]
l.insert(0, 1)
l.pop(0)

... और मैं एक स्टैक को लागू करने के लिए लिंक की गई सूची का उपयोग करने में नहीं जुटा हूं।


1

पुश एक परिभाषित स्टैक व्यवहार है; यदि आपने A को स्टैक (B, C, D) पर धकेला तो आपको मिलेगा (A, B, C, D)।

यदि आप अजगर एपेंड का उपयोग करते हैं, तो परिणामी डाटासेट (बी, सी, डी, ए) जैसा दिखेगा।

संपादित करें: वाह, पवित्र पैदल सेना।

मैं यह मानूंगा कि यह मेरे उदाहरण से स्पष्ट होगा कि सूची का कौन सा भाग सबसे ऊपर है, और कौन सा भाग नीचे है। यह मानते हुए कि हममें से अधिकांश लोग बाएं से दाएं पढ़ते हैं, किसी भी सूची का पहला तत्व हमेशा बाईं ओर होता है।


1
यह सच नहीं है, पॉप सूची के अंत से हटाता है, सामने से नहीं।
फोरट्रान

4
उस पृष्ठ को पढ़ें जिसे आप लिंक करते हैं। स्टैक के शीर्ष पर पुश करने के रूप में पुश को परिभाषित किया गया है। जो अंत है "शीर्ष" कार्यान्वयन पर निर्भर करता है। एक सरणी-आधारित स्टैक में, सरणी के अंत में धक्का होगा। लिंक-लिस्ट-आधारित स्टैक में, पुश शुरुआत में होगा।
किप

0

शायद इसलिए कि पायथन ( C Python) का मूल संस्करण C में लिखा गया था, C ++ नहीं।

यह विचार कि किसी चीज़ को किसी चीज़ के पीछे धकेलने से एक सूची बनती है, संभवतः उन्हें जोड़ने के विचार के रूप में अच्छी तरह से ज्ञात नहीं है।


दूसरा भाग एक अच्छा उत्तर है। लेकिन इसका C / C ++ में लागू होने से क्या लेना-देना है?
जेसन बेकर

@ जेसन: C ++ के STL में, push_back () है कि आप सूची में कैसे शामिल होते हैं। मैं मेटा-आइडिया को यह बताने की कोशिश कर रहा था कि सूचियों को धक्का देने से जो आइडिया बनता है, अगर आप C ++ में काम कर रहे हैं तो पॉप अप होने की संभावना अधिक है। इसका कोई मतलब है?
खोलना

यदि आपके पास एक सन्निहित सरणी (C ++ में एक वेक्टर, पायथन में एक सूची, पर्ल में एक सरणी) के रूप में कार्यान्वित सूची प्रकार है, तो यह समझ में आता है कि अंत में नए तत्व को "पुश" किया जाए। कृपया ध्यान दें कि पर्ल 4 को "पुश" और "पॉप" माना जाता है, जैसे कि पायथन के एपेंड / पॉप और सी ++ के पुश_बैक / पॉप_बैक जैसे सरणियों पर फ़ंक्शन, और इससे पहले कि एसटीएल को औपचारिक रूप से सी ++ के लिए प्रस्तावित किया गया था। इसलिए इसका C ++ की STL से कोई लेना-देना नहीं है।
एंड्रयू डल्के

मैं एक पर्ल पृष्ठभूमि से अजगर सीखने से चूक जाएं चीज़ों में से एक का उपयोग करने की क्षमता है निर्मित धक्का (), पाली (), और unshift (पॉप (),) के संचालन के दोनों छोर से / करने के लिए निकालें तत्वों को जोड़ने के / एक ही सरणी । भले ही मैं "स्टाकिश" क्लास या "क्यूशिश" क्लास में पायथन लिस्ट को आसानी से लपेट सकता हूं, लेकिन दोनों को एक साथ करना इतना आसान (या कुशल) नहीं लगता।
पीटर

-2

पुश और पॉप एक कैफेटेरिया या बुफे में प्लेटों या ट्रे के ढेर के रूपक के संदर्भ में समझ में आता है, विशेष रूप से धारक के प्रकार में जिनके पास एक वसंत है, इसलिए शीर्ष प्लेट (अधिक या कम ... सिद्धांत में) है एक ही जगह में चाहे कितनी भी प्लेटें हों।

यदि आप एक ट्रे को हटाते हैं, तो वसंत पर वजन थोड़ा कम होता है और स्टैक "चबूतरे" को थोड़ा ऊपर उठाता है, यदि आप प्लेट को वापस डालते हैं, तो यह स्टैक को नीचे धकेलता है। इसलिए यदि आप सूची के बारे में सोचते हैं कि शीर्ष पर एक स्टैक और अंतिम तत्व के रूप में है, तो आपको बहुत भ्रम नहीं होना चाहिए।

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