পাইথন তালিকাগুলিতে কেন পপ রয়েছে () তবে পুশ নয় ()


265

পাইথনের list.appendক্রিয়াকলাপটি কেন বলা হচ্ছে না এমন কি কেউ জানেন list.pushযে ইতিমধ্যে এমন একটি রয়েছে list.popযা শেষ উপাদানটি সরিয়ে দেয় এবং ফিরে আসে (যেটি 1-এ সূচকযুক্ত) এবং list.appendশব্দার্থ ব্যবহারের সাথে সামঞ্জস্যপূর্ণ?


21
<nitpick> এটি একটি পদ্ধতি, কোনও ফাংশন নয় </ </ nitpick>
টিম পিটজেকার

49
আমি মনে করি এটি একটি দুর্দান্ত প্রশ্ন, যদিও এটি সম্ভবত উচ্চারণ করা উচিত: "পাইথন তালিকাগুলিতে পপ () তবে পুশ () নয় কেন"।
উরি

6
popতালিকার যে কোনও জায়গা থেকে আইটেমগুলি পপ করতে পারে। appendতালিকার মাঝখানে কিছু "ধাক্কা" দিতে পারে না।
এন্ডোলিথ

@ টিমপিটজেকার <নিটপিক ^ 2> পদ্ধতিটি আসলে একটি ফাংশনও, পদ্ধতি (সদস্য ফাংশন) একটি ফাংশনের একটি উপসেট :)
jave.web

উত্তর:


246

কারণ "অ্যাপেন্ড" এর "পপ" চিন্তা করার অনেক আগে থেকেই ছিল। পাইথন 0.9.1 গোড়ার দিকে 1991 তূলনামূলকভাবে সমর্থিত list.append, এখানে অংশ comp.lang.python আলোচনা 1997. পপ যোগ গাইডো লিখেছিলেন সম্পর্কে:

একটি স্ট্যাক বাস্তবায়নের জন্য, একটি তালিকা যুক্ত করতে হবে.পপ () আদিম (এবং না, আমি কোনও নীতির ভিত্তিতে এই বিশেষটির বিরুদ্ধে নই)। list.pop () list.pop () এর সাথে প্রতিসাম্যের জন্য যুক্ত করা যেতে পারে তবে আমি একই ক্রিয়াকলাপের জন্য একাধিক নামের একটি বড় অনুরাগী নই - খুব শীঘ্রই আপনি অন্য কোডটি ব্যবহার করেন এমন কোড পড়তে চলেছেন, তাই আপনার উভয়ই শিখতে হবে যা আরও জ্ঞানীয় বোঝা।

আপনি আইকনের তালিকার একটি রেফারেন্স পোস্ট করেছেন যেখানে ধাক্কা / পপ / পুট / টান উপাদানতে [0] বা উপাদানটির পরে [-1] হওয়া উচিত কিনা সে সম্পর্কেও তিনি আলোচনা করতে পারবেন:

আমি দৃ sti়ভাবে মনে করি যে এই সমস্ত কিছুই তালিকা অবজেক্ট বাস্তবায়নের বাইরে চলে গেছে - যদি আপনাকে নির্দিষ্ট শব্দার্থবিজ্ঞানের সাথে একটি স্ট্যাক, বা একটি সারি প্রয়োজন হয় তবে একটি তালিকা ব্যবহার করে এমন একটি ছোট্ট ক্লাস লিখুন

অন্য কথায়, পাইথন তালিকাগুলি হিসাবে সরাসরি প্রয়োগ করা স্ট্যাকগুলি, যা ইতিমধ্যে দ্রুত সংযোজন (), এবং ডেল তালিকার সমর্থন করে [-1], এটি বোঝায় যে list.pop () শেষ উপাদানটিতে ডিফল্টরূপে কাজ করে। এমনকি অন্য ভাষাগুলি যদি এটি আলাদাভাবে করে।

এখানে অন্তর্ভুক্তটি হ'ল বেশিরভাগ ব্যক্তির একটি তালিকায় সংযোজন করা প্রয়োজন, তবে খুব কম লোকেরই তালিকাগুলি স্ট্যাক হিসাবে বিবেচনা করার জন্য উপলক্ষ রয়েছে, যার কারণে list.append এত আগে এসেছিল।


16
@ পোয়েজ you're going to *read* code that uses the other one (...) which is more cognitive loadমনে রাখবেন "কোনও ধাক্কা নেই" কেবল আপনি যখন কোড লিখছেন তখন জ্ঞানীয় বোঝার পরিচয় দেয়। "পুশ অ্যাপেন্ডের জন্য হুবহু প্রতিশব্দ" মনে রাখলে জ্ঞানীয় লোডের পরিচয় হয় যখনই আপনি কম ব্যবহার করেন দেখেন used দেখুন stackoverflow.com/questions/3455488/... কেন মানুষ মনে পাঠযোগ্যতা প্রায়ই ত্রাম্প্স writeability আরো অনেক কিছুর জন্য
stevenjackson121

2
অজুহাত / বোধগম্য কিছুই করে না
পাইগ

15

কারণ এটি সংযোজন; এটা ধাক্কা না। "সংযোজন" একটি তালিকার শেষে, "ধাক্কা" সামনের দিকে যুক্ত করে।

একটি সারি বনাম একটি স্ট্যাকের কথা ভাবেন।

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

সম্পাদনা: আমার দ্বিতীয় বাক্যটিকে আরও সঠিকভাবে উচ্চারণ করতে, "সংযোজন" খুব স্পষ্টভাবে বোঝায় যে অন্তর্নিহিত বাস্তবায়ন নির্বিশেষে তালিকার শেষে কিছু যুক্ত করা হবে । যখন "ধাক্কা" দেওয়া হয় তখন কোনও নতুন উপাদান যুক্ত হয়। একটি স্ট্যাকের দিকে ধাক্কা "শীর্ষে" কিছু রাখছে তবে এটি আসলে অন্তর্নিহিত ডেটা স্ট্রাকচারে কোথায় যায় তা পুরোপুরি বাস্তবায়নের উপর নির্ভর করে। অন্যদিকে, একটি কাতারে চাপ দেওয়া বোঝায় এটি এটিকে শেষ পর্যন্ত যুক্ত করা।


4
টিউটোরিয়ালটি মনে হয় যে এটি কেবল শেষ থেকে ধাক্কা দেয় এবং পপ হয়: "তালিকার পদ্ধতিগুলি স্ট্যাক হিসাবে একটি তালিকা ব্যবহার করা খুব সহজ করে তোলে, যেখানে যুক্ত করা শেষ উপাদানটি প্রথম উপাদানটি পুনরুদ্ধার করা হয় (" শেষ-ইন, প্রথম-আউট) ")। স্ট্যাকের শীর্ষে কোনও আইটেম যুক্ত করতে অ্যাপেনড () ব্যবহার করুন। স্ট্যাকের শীর্ষ থেকে কোনও আইটেম উদ্ধার করতে, সুস্পষ্ট সূচক ছাড়াই পপ () ব্যবহার করুন।"
উরি

110
"ঠেলা" কোনওভাবেই সামনের দিকে যুক্ত করা। কোনও স্ট্যাকের প্রতিটি প্রয়োগ যা কোনও বুদ্ধিমান ব্যক্তি লিখেছেন স্ট্যাকের উপরের (শেষ) দিকে, স্ট্যাকের নীচে (শুরু) নয়
কিপ

4
সংশোধন: প্রতিটি * অ্যারে-ভিত্তিক বাস্তবায়ন। একটি লিঙ্ক-তালিকা বাস্তবায়ন মাথা ঠেলাঠেলি করবে।
কিপ করুন

16
জাভাস্ক্রিপ্ট pushশেষ যোগ করে।
কোবি

2
না, list.popশব্দার্থবিজ্ঞানের অ্যাকাউন্টে থাকা অবস্থায় , list.appendউপাদানগুলিকে স্ট্যাক হিসাবে দেখলে তালিকায় ঠেলে দেয়।
14:53

10

কারণ এটি একটি তালিকায় একটি উপাদান যুক্ত করে? পুশ সাধারণত স্ট্যাকের উল্লেখ করার সময় ব্যবহৃত হয়।


7
একটি তালিকা যদিও স্ট্যাক হতে পারে। :-)
জেসন বেকার

@ জেসনবেকার আপনি একটি তালিকা ব্যবহার করে একটি স্ট্যাক প্রয়োগ করতে পারেন, তবে এর অর্থ তালিকা == স্ট্যাক নয়। আপনি যদি সত্যিই চান তবে আপনি একটি সারি ব্যবহার করে একটি স্ট্যাকও প্রয়োগ করতে পারেন। (এটি মারাত্মকভাবে অদক্ষ হয়ে উঠবে, তবে এটি সম্ভব!)
মার্ক ই। হাজেস

বিভ্রান্তিটি আসলে এই সত্য থেকেই আসে যে একটি স্ট্যাকের একটি তালিকার মতো "শুরু" বা "শেষ" নেই, বরং একটি "শীর্ষ" এবং "নীচে" রয়েছে। স্ট্যাকে যুক্ত হওয়ার অর্থ শীর্ষে একটি উপাদান স্থাপন এবং নীচে "ঠেলা"। সামনে "পুশিং" কোনও ধারণা দেয় না (অন্তত ভাষাগতভাবে নয়)। এবং কেবল জিনিসগুলিকে আরও বিভ্রান্ত করার জন্য, সি ++ "পুশফ্রন্ট" এবং "পুশ_ব্যাক" ব্যবহার করে।
জেস্পেরি

9

কারণ "সংযোজন" এর স্বজ্ঞাত অর্থ "তালিকার শেষে যুক্ত করুন"। যদি এটি "ধাক্কা" বলা হত, তবে এটি লেজ বা তালিকার শীর্ষে আমরা স্টাফ যুক্ত করছি কিনা তা অস্পষ্ট হবে।


12
popঅপারেশন হওয়ার পরে এটি বোঝা যায় না make যেহেতু pushএবং popসাধারণত অপারেশনগুলি স্ট্যাক করে এবং একসাথে যায় তাই এটি আশা করা উচিত যে তারা তালিকার একই প্রান্তে কাজ করে।
জেমসডলিন 19

7

কোনও উপায়ে অফিসিয়াল উত্তর নয় (ভাষাটি ব্যবহারের ভিত্তিতে কেবল অনুমান), তবে পাইথন আপনাকে তালিকাটিকে স্ট্যাক হিসাবে ব্যবহার করতে দেয় (উদাহরণস্বরূপ, টিউটোরিয়ালের বিভাগ 5.1.1 )। যাইহোক, একটি তালিকা এখনও সমস্ত তালিকার প্রথম, সুতরাং যে ক্রিয়াকলাপগুলি স্ট্যাক শর্তাবলীর (যেমন, পুশ) পরিবর্তে উভয় ক্ষেত্রে ব্যবহারের তালিকার শর্তাদি (যেমন, সংযোজন) ব্যবহার করে। যেহেতু তালিকার ক্ষেত্রে পপ অপারেশনটি সাধারণ নয় (যদিও 'অপসারণকৃত' ব্যবহার করা যেতে পারে), তারা একটি পপ সংজ্ঞা দেয় () তবে পুশ নয়) (


3

ঠিক আছে, এখানে ব্যক্তিগত মতামত, তবে সংযোজন এবং সেটগুলিতে একটি সেটে যথাযথ অবস্থানগুলি প্রস্তুত করুন।

পুশ এবং পপ সত্যিই এমন ধারণাগুলি যা কোনও সেটের উভয় প্রান্তে প্রয়োগ করা যেতে পারে ... যতক্ষণ আপনি সামঞ্জস্যপূর্ণ হন ... কোনও কারণে, আমার কাছে, পুশ () মনে হয় এটি কোনও সামনের অংশে প্রয়োগ করা উচিত সেট করুন ...


3
যেহেতু আপনি এটি এনেছেন, যদি অ্যারেগুলির একটি .append () ফাংশন থাকে, তবে কেন সেখানে কোনও সম্পর্কিত.প্রেপেন্ড () ফাংশন নেই? আমি প্রিপেন্ড করতে .insert (0, ভাল) ব্যবহার করতে শিখতে পারি, তবে তার পরে একটি সম্পর্কিত .ডিলিট (পোজ, ভাল) ফাংশনের অভাবে বিব্রত বোধ করি। রেফ: ডকস.পিথন.আর.

3

এফওয়াইআই, একটি ধাক্কা পদ্ধতি রয়েছে এমন একটি তালিকা তৈরি করা মারাত্মকভাবে কঠিন নয়:

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

পুশ একটি সংজ্ঞায়িত স্ট্যাক আচরণ; আপনি যদি স্টকে (বি, সি, ডি) চাপিয়ে দেন তবে আপনি (এ, বি, সি, ডি) পাবেন।

আপনি যদি অজগর সংযোজন ব্যবহার করেন তবে ফলাফলের ডেটাসেট দেখতে দেখতে (বি, সি, ডি, এ) হবে

সম্পাদনা করুন: বাহ, পবিত্র পেডেন্ট্রি।

আমি ধরে নেব যে এটি আমার উদাহরণ থেকে পরিষ্কার হবে যে তালিকার কোন অংশটি শীর্ষ এবং কোন অংশটি নীচে রয়েছে। ধরে নিলাম যে আমাদের বেশিরভাগ এখানে বাম থেকে ডানে পড়ছে, যে কোনও তালিকার প্রথম উপাদানটি সর্বদা বাম দিকে থাকবে।


1
এটি সত্য নয়, পপ তালিকাটির শেষে থেকে সরান, সামনে থেকে নয়।
14:48

4
আপনার লিঙ্ক করা পৃষ্ঠাটি পড়ুন। ধাক্কা স্ট্যাকের শীর্ষে ধাক্কা হিসাবে সংজ্ঞায়িত করা হয়। কোনটি "শীর্ষ" তা বাস্তবায়নের উপর নির্ভর করে। অ্যারে-ভিত্তিক স্ট্যাকে, ধাক্কাটি অ্যারের শেষের দিকে ধাক্কা দেয়। একটি লিঙ্কযুক্ত-ভিত্তিক স্ট্যাকের মধ্যে, ধাক্কা শুরুতে ধাক্কা দেবে।
কিপ করুন

0

সম্ভবত কারণ পাইথনের মূল সংস্করণ ( সি পাইথন) সিতে লেখা হয়েছিল, সি ++ নয়।

কোনও কিছুর পিছনে জিনিস ঠেলে একটি তালিকা তৈরি করা হয়েছে এমন ধারণা সম্ভবত এগুলি সংযোজন করার চিন্তাধারা হিসাবে সুপরিচিত নয়।


দ্বিতীয় অংশটি একটি ভাল উত্তর। তবে এর সাথে সি / সি ++ এ প্রয়োগ হওয়ার কী আছে?
জেসন বেকার

@ জেসন: সি ++ এর এসটিএল-তে, পুশ_ব্যাক () কীভাবে আপনি একটি তালিকায় যুক্ত হন। আমি মেটা-ধারণাটি জানানোর চেষ্টা করছিলাম যে তালিকাগুলি ধাক্কা দিয়ে তৈরি হয় সেই ধারণাটি সম্ভবত আপনি সি ++ এ কাজ করছেন তবে পপ আপ হওয়ার সম্ভাবনা বেশি। কোন ধারণা আছে?
বিনোদন

যদি আপনার কাছে একটি তালিকার ধরণের সংকলনযুক্ত অ্যারে (সি ++ তে ভেক্টর, পাইথনের একটি তালিকা, পার্লের একটি অ্যারে) হিসাবে প্রয়োগ করা থাকে তবে নতুন উপাদানটিকে শেষে "ধাক্কা" দেওয়ার জন্য এটি বোধগম্য হয়। আপনি দয়া করে নোট করবেন যে পার্ল 4 পাইথনের অ্যাপেন্ড / পপ এবং সি ++ এর পুশব্যাক / পপ_ব্যাকের মতো অ্যারেগুলিতে ঠিক ফাংশন হিসাবে "ধাক্কা" এবং "পপ" হিসাবে বিবেচিত হবে এবং এসটিএলকে আনুষ্ঠানিকভাবে সি ++ করার প্রস্তাব দেওয়ার আগেই। সুতরাং এটির সাথে সি ++ এর এসটিএল কোনও নতুন ধারণা তৈরি করার কোনও সম্পর্ক নেই।
অ্যান্ড্রু ডালক

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

-2

পুশ এবং পপ একটি ক্যাফেটেরিয়া বা বুফেতে স্ট্যাকের প্লেট বা ট্রেগুলির রূপক হিসাবে বিবেচনা করে, বিশেষত ধারক ধরণের যেটির নীচে একটি বসন্ত থাকে তাই শীর্ষ প্লেটটি (তাত্ত্বিকভাবে আরও কম) এটির অধীনে কতগুলি প্লেট রয়েছে তা একই জায়গায়।

যদি আপনি কোনও ট্রে অপসারণ করেন তবে বসন্তের ওজন কিছুটা কম হয় এবং স্ট্যাকটি কিছুটা "উপরে উঠে যায়", আপনি যদি প্লেটটি পিছনে রাখেন তবে এটি স্ট্যাকটিকে "ধাক্কা" দেয়। সুতরাং আপনি যদি তালিকাটিকে স্ট্যাক হিসাবে এবং সর্বশেষ উপাদানটিকে শীর্ষে হিসাবে নিয়ে ভাবেন, তবে আপনার খুব বেশি বিভ্রান্তি হওয়া উচিত নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.