তালিকা, ডেল অপসারণ এবং পপ মধ্যে পার্থক্য


923
>>> a=[1,2,3]
>>> a.remove(2)
>>> a
[1, 3]
>>> a=[1,2,3]
>>> del a[1]
>>> a
[1, 3]
>>> a= [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]
>>> 

তালিকা থেকে কোনও উপাদান অপসারণ করতে উপরের তিনটি পদ্ধতির মধ্যে কি কোনও পার্থক্য রয়েছে?


1
সেট ডেটা স্ট্রাকচারের জন্য অনুরূপ লাইনে সম্পর্কিত পোস্ট - পাইথনের সেট.ডিসকার্ড এবং সেট.রেম পদ্ধতির মধ্যে রানটাইম পার্থক্য?
আরবিটি

উত্তর:


1326

হ্যাঁ, প্রথম মিলের মানটিremove সরিয়ে দেয় , নির্দিষ্ট সূচকটি নয়:

>>> a = [0, 2, 3, 2]
>>> a.remove(2)
>>> a
[0, 3, 2]

del নির্দিষ্ট সূচীতে আইটেমটি সরিয়ে দেয়:

>>> a = [9, 8, 7, 6]
>>> del a[1]
>>> a
[9, 7, 6]

এবং popনির্দিষ্ট সূচীতে আইটেমটি সরিয়ে ফেরত দেয়।

>>> a = [4, 3, 5]
>>> a.pop(1)
3
>>> a
[4, 5]

তাদের ত্রুটি করার পদ্ধতিগুলিও পৃথক:

>>> a = [4, 5, 6]
>>> a.remove(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>> del a[7]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> a.pop(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range

14
@ জ্যাক্স্রামোস: delকোনও সিনট্যাক্স হোল্ডওভার নয়, না। সিনট্যাক্স শুধু মতো অপরিবর্তিত returnবা ifবা while
মার্টিজন পিটারস

5
এটি উল্লেখযোগ্য যে ব্যবহারকারীদের তালিকার পুনরাবৃত্তি এবং পুনরাবৃত্ত হওয়ার সাথে সাথে এই ফাংশনগুলি ব্যবহার করার সময় তাদের যত্নবান হওয়া উচিত।
হামানে ২৯'১২

16
delউদাহরণস্বরূপ কিছুটা বিভ্রান্তিকর করা হয়। ঠিক কোন উপাদানটি সরানো হয়েছে? ২ য় বা ৩ য়? আপনার ব্যবহার করা উচিত ছিল [9, 8, 7, 6], del a[1]এবং[9, 7, 6]
gromit190

2
@ rite2hhh এটি সাম্যের জন্য পরীক্ষা করে। প্রথমত অপ্টিমাইজেশন হিসাবে পরিচয়ের জন্য সমতা পরীক্ষার পরীক্ষা
মার্টিজান পিটার

1
@ rite2hhh: মান সমতা অভিব্যক্তি রেফারেন্সে আচ্ছাদিত ।
মার্টিজন পিটারস

182

ব্যবহার করুন delসূচক দ্বারা একটি উপাদান মুছে ফেলার জন্য, pop()সূচক দ্বারা এটি অপসারণ করতে আপনি ফিরে মান প্রয়োজন, এবং remove()মান একটি উপাদান মুছে দিন। পরবর্তীটির জন্য তালিকার সন্ধান প্রয়োজন এবং তালিকায় ValueErrorযদি এরকম কোনও মান না ঘটে তা উত্থাপন করে।

উপাদানগুলির iএকটি তালিকা থেকে সূচকটি মোছার সময় n, এই পদ্ধতিগুলির গণ্য জটিলতা

del     O(n - i)
pop     O(n - i)
remove  O(n)

1
পপের জন্য তালিকাটি অনুসন্ধান করা দরকার
স্যাচিন ইরুকুল

30
জটিলতা ভাঙ্গার জন্য +1। তালিকার শেষে যখন উপাদানটি থাকে তখন মুছুন এবং পপ কীভাবে স্থির থাকে তা চিত্রিত করে।
বিগ শার্পি

2
ছেলেরা মনে রাখবেন ... ভিত্তিক যে কোনও সূচক হ'ল একটি শট হে (এন -1) ... আপনার যদি কোনও অনুসন্ধান (মান অনুসারে) করতে হয় তবে উপাদানটি খুঁজে পাওয়া পর্যন্ত এটি সংগ্রহকে অতিক্রম করবে।
পেপিতো ফার্নান্দেজ

2
তালিকার সূচী অনুসারে @ পেপিটো ফার্নান্দেজ লুক-আপগুলি পাইথনের ও (1)। (পাইথনের একটি তালিকা সি ++ এর ভেক্টরের অনুরূপ similar)
সোভেন মারনাচ

3
@ প্লাজমাবিন্টুরং আপনি যা ভাবেন তার চেয়ে বেশি পাঠযোগ্য বলে আপনার ব্যবহার করা উচিত, যদি না আপনার কাছে এমন ডেটা থাকে যা প্রমাণ করে যে পারফরম্যান্সের বিষয়টি গুরুত্বপূর্ণ। এবং যদি আপনার কাছে থাকে তবে আপনার নির্দিষ্ট ক্ষেত্রে আপনাকে আরও দ্রুত কী পরিমাপ করতে হবে। আমার অনুমানটিও এটি delসামান্য দ্রুত, তবে ভিন্ন কারণে: __delitem__সিতে প্রয়োগ করা একটি প্রকারের জন্য নাম অনুসন্ধানের পরিবর্তে সূচকের দ্বারা ঘটে, যেখানে popপুরো বিবরণী প্রোটোকলটি অনুসরণ করা উচিত। ফাংশনগুলি সম্পাদন করার সময় তাদের একই পরিমাণ নেওয়া উচিত। উভয়ই একটি পয়েন্টার দেয় - একটি মুছে ফেলা অবজেক্টে, অন্যটিতে None
সোভেন মারনাচ

91

যেহেতু অন্য কারও এটি উল্লেখ করা হয়নি, নোট করুন যে del(বিপরীতে pop) তালিকাগুলির তালিকা বিছিন্ন করার কারণে বিভিন্ন সূচী অপসারণের অনুমতি দেয়:

>>> lst = [3, 2, 2, 1]
>>> del lst[1:]
>>> lst
[3]

IndexErrorসূচক তালিকায় না থাকলে এটি এড়াতেও অনুমতি দেয় :

>>> lst = [3, 2, 2, 1]
>>> del lst[10:]
>>> lst
[3, 2, 2, 1]

55

ইতিমধ্যে অন্যদের দ্বারা বেশ ভাল উত্তর দেওয়া হয়েছে। এই আমার শেষ থেকে :)

বনাম পপ বনাম দেল সরান

স্পষ্টতই, popএকমাত্র মানটি ফেরত দেয় এবং removeকেবলমাত্র এটি delমুছে ফেলার ক্ষেত্রে সীমাবদ্ধ রাখার পরে অবজেক্টটি সন্ধান করে।


2
Thnx! একটি দ্রষ্টব্য: পাইথনগুলিতে, তালিকাগুলি কার্যকর করার জন্য (সেখানে ব্যবহারিকভাবে অ্যারে ...!), "নোড পজিশন
অবধি অগ্রণী

19

অনেক সেরা ব্যাখ্যা এখানে কিন্তু আমি আরও সহজ করার জন্য যথাসাধ্য চেষ্টা করব।

এই সমস্ত পদ্ধতির মধ্যে, বিপরীত ও পপ পোস্টফিক্স রয়েছে যখন মুছুন উপসর্গ হয়

মুছে ফেলা (): এটি উপাদানটির প্রথম উপস্থিতি সরাতে ব্যবহৃত হয়েছিল

remove(i) => প্রথম মান আমার মান

>>> a = [0, 2, 3, 2, 1, 4, 6, 5, 7]
>>> a.remove(2)   # where i = 2
>>> a
[0, 3, 2, 1, 4, 6, 5, 7]

পপ (): এটি উপাদান অপসারণ করতে ব্যবহৃত হয় যদি:

অসূচিত

pop() => তালিকার শেষে থেকে

>>>a.pop()
>>>a
[0, 3, 2, 1, 4, 6, 5]

নিদিষ্ট

pop(index) => সূচকের

>>>a.pop(2)
>>>a
[0, 3, 1, 4, 6, 5]

সতর্কতা: সামনে বিপদজনক পদ্ধতি

মুছুন () : এটি একটি উপসর্গ পদ্ধতি।

একই পদ্ধতির জন্য দুটি পৃথক সিনট্যাক্সের দিকে নজর রাখুন: [] এবং ()। এটিতে ক্ষমতা রয়েছে:

1. মুছে ফেলা তালিকা

del a[index] => ঠিক পপের মতো সূচি এবং এর সাথে সম্পর্কিত মান মুছতে ব্যবহৃত হয়।

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]

2. পরিসীমা মান মুছুন [সূচী 1: সূচক এন]

del a[0:3] => পরিসরে একাধিক মান

>>>del a[0:3]
>>>a
[6, 5]

3. শেষ কিন্তু তালিকা নয়, এক শটে পুরো তালিকা মুছতে

del (a) => উপরে যেমন বলা হয়েছে।

>>>del (a)
>>>a

আশা করি এটি যদি বিভ্রান্তির কিছু থাকে তবে স্পষ্ট করে দেয়।


18

পপ - সূচক নেয় এবং মান দেয়

সরান - মান নেয়, প্রথম ঘটনাটি সরিয়ে দেয় এবং কিছুই দেয় না

মুছুন - সূচক নেয়, সেই সূচকের মান সরিয়ে দেয় এবং কিছুই দেয় না


2

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

class Deque(object):

  def __init__(self):

    self.items=[]

  def addFront(self,item):

    return self.items.insert(0,item)
  def addRear(self,item):

    return self.items.append(item)
  def deleteFront(self):

    return self.items.pop(0)
  def deleteRear(self):
    return self.items.pop()
  def returnAll(self):

    return self.items[:]

এখানে, অপারেশনগুলি দেখুন:

def deleteFront(self):

    return self.items.pop(0)
def deleteRear(self):
    return self.items.pop()

অপারেশন কিছু ফেরত দিতে হবে। সুতরাং, পপ - একটি সূচক সহ এবং ছাড়াই। আমি যদি মানটি ফিরিয়ে দিতে না চাই: ডেল সেলফি.আইটিমস [0]

সূচক নয় মান অনুসারে মুছুন:

  • অপসারণ :

    list_ez=[1,2,3,4,5,6,7,8]
    for i in list_ez:
        if i%2==0:
            list_ez.remove(i)
    print list_ez

ফিরে আসে [1,3,5,7]

আসুন সেটগুলির ক্ষেত্রে বিবেচনা করা যাক।

set_ez=set_ez=set(range(10))

set_ez.remove(11)

# Gives Key Value Error. 
##KeyError: 11

set_ez.discard(11)

# Does Not return any errors.

1

উভয় পপ এবং মুছে ফেলার সময় উপরের মন্তব্যে বর্ণিত হিসাবে একটি উপাদান অপসারণ সূচক নিতে। একটি মূল পার্থক্য হ'ল তাদের জন্য সময় জটিলতা। কোনও সূচক ছাড়াই পপ () এর সময়ের জটিলতা হ'ল (1) তবে শেষ উপাদানটি মোছার ক্ষেত্রে একই ঘটনা নয়।

যদি আপনার ব্যবহারের ক্ষেত্রে সর্বদা সর্বশেষ উপাদানটি মুছতে হয় তবে মুছে ফেলা () এর চেয়ে বেশি পপ () ব্যবহার করা ভাল। সময়ের জটিলতার বিষয়ে আরও ব্যাখ্যার জন্য আপনি https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt দেখুন


2
এটি একাধিক উপায়ে ভুল। তেমন কোনও পদ্ধতি নেই delete। পার্থক্যগুলি popহ'ল মানটি ফেরত দেয় এবং delএটি টুকরোগুলিতে কাজ করে। যে ক্ষেত্রে popকাজ করে, delঠিক একই গণনা জটিলতা রয়েছে (এবং একটি ধ্রুবক শব্দ দ্বারা কিছুটা দ্রুত)।
abarnert

1

অপসারণ তালিকায় অপারেশন সরানোর জন্য একটি মান দেওয়া হয়। এটি সেই মানটির সাথে একটি আইটেম সন্ধানের জন্য তালিকার সন্ধান করে এবং এটি খুঁজে পাওয়া প্রথম মিলে যাওয়া আইটেমটি মুছে দেয়। আপনার সাথে মেলে এমন আইটেমটি আছে, তাহলে একটি উত্থাপন এটা একটি ত্রুটি ValueError

>>> x = [1, 0, 0, 0, 3, 4, 5]
>>> x.remove(4)
>>> x
[1, 0, 0, 0, 3, 5]
>>> del x[7]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[7]
IndexError: list assignment index out of range

দেল বিবৃতি একটি সম্পূর্ণ তালিকা মুছে ফেলতে ব্যবহার করা যাবে। ডেল করার পক্ষে আপনার যুক্তি হিসাবে যদি কোনও নির্দিষ্ট তালিকা আইটেম থাকে (যেমন তালিকার 8 ম আইটেমটি উল্লেখ করার জন্য তালিকার নাম [7]), এটি কেবলমাত্র সেই আইটেমটি মুছে ফেলবে। এমনকি একটি তালিকা থেকে "স্লাইস" মুছে ফেলা সম্ভব। সীমার বাইরে সূচি বাইরে থাকলে কোনও ত্রুটি হয়, একটি সূচিপত্র উত্থাপন করে ।

>>> x = [1, 2, 3, 4]
>>> del x[3]
>>> x
[1, 2, 3]
>>> del x[4]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[4]
IndexError: list assignment index out of range

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

>>> x = [1, 2, 3] 
>>> x.pop(2) 
3 
>>> x 
[1, 2]
>>> x.pop(4)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    x.pop(4)
IndexError: pop index out of range

আরও বিশদের জন্য সংগ্রহগুলি দেখুন que


-1

মুছে ফেলা মূলত মান নিয়ে কাজ করে। মুছুন এবং সূচীতে পপ কাজ

মুছে ফেলুন মূলত প্রথম ম্যাচের মানটি সরিয়ে দেয়। মুছে ফেলা একটি নির্দিষ্ট সূচক থেকে আইটেম মোছা পপ মূলত একটি সূচক গ্রহণ করে এবং সেই সূচীতে মানটি প্রদান করে। পরের বার আপনি তালিকাটি মুদ্রণ করলে মানটি উপস্থিত হয় না।

উদাহরণ:


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

-3

আপনি সূচক দ্বারাও কোনও মান সরাতে অপসারণ ব্যবহার করতে পারেন।

n = [1, 3, 5]

n.remove(n[1])

n এরপরে [1, 5] দেখুন


43
n = [5, 3, 5]তাহলে চেষ্টা করুন n.remove(n[2])
অবার্নেট

@ বার্নার্ট আপনার ব্যবহারের ক্ষেত্রে নীচের কেস এন = [5,3,5] এর সাথে সিঙ্কে কাজ করে, তারপরে এন.রেভ (5)। এই উভয়ই তালিকা থেকে প্রথম সম্মুখীন উপাদানটি সরিয়ে দেয়।
আখিল ঘাটকি

@AkhilGhatiki n.remove(n[2])অপসারণ n[0]না n[2]। সুতরাং এটি শুধু রৈখিক সময় কোন কারণে (কোন বড় চুক্তি হয়তো যখন এন = 3), এটি ভুল (একটি বড় চুক্তি কোন ব্যাপার এন কি)
abarnert
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.