डेल, हटाने और सूचियों पर पॉप के बीच अंतर


924
>>> 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
संबंधित डेटा संरचना के लिए समान पंक्तियों पर संबंधित पोस्ट - पायथन में set.discard और set.remove विधियों के बीच रनटाइम अंतर?
RBT

जवाबों:


1328

हां, पहला मिलान मूल्य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
@jxramos: delसिंटैक्स होल्डओवर नहीं है। वाक्य रचना की तरह ही, अपरिवर्तित है returnया ifया while
मार्टिन पीटर्स

5
यह ध्यान देने योग्य है कि उपयोगकर्ताओं को सावधान रहना चाहिए जब किसी सूची पर पुनरावृत्ति हो रही हो और उस समय इन कार्यों का उपयोग कर रहे हों जब वे परेशान हो रहे हों।
हैमनी

16
delउदाहरण के लिए कुछ हद तक भ्रामक है। कौन सा तत्व हटा दिया जाता है, बिल्कुल? द 2 या ह 3? आप का उपयोग किया जाना चाहिए [9, 8, 7, 6], del a[1]और[9, 7, 6]
gromit190

2
@ 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
सूची में सूचकांक द्वारा @PepitoFernandez लुक-अप पायथन में O (1) हैं। (पायथन में एक सूची C ++ में एक वेक्टर के समान है।)
स्वेन मार्नाच

3
@PlasmaBinturong आपको तब तक उपयोग करना चाहिए जो आपको लगता है कि अधिक पठनीय है, जब तक कि आपके पास डेटा नहीं है जो साबित करता है कि प्रदर्शन मायने रखता है। और यदि आपके पास है, तो आपको यह मापने की आवश्यकता है कि आपके विशिष्ट मामले में क्या तेजी से है। मेरा अनुमान यह भी है कि 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! एक नोट: अजगर में, सूचियों को लागू करने के तरीके के कारण (वहाँ व्यावहारिक रूप से सरणियाँ ...!), "उस नोड स्थिति तक अग्रिम" हे (1)
ntg

19

कई सर्वश्रेष्ठ स्पष्टीकरण यहाँ हैं, लेकिन मैं अधिक सरल बनाने के लिए अपनी पूरी कोशिश करूँगा।

इन सभी तरीकों के अलावा, रिवर्स और पॉप हैं पोस्टफ़िक्स जबकि हटाना है उपसर्ग

remove (): इसका उपयोग तत्व की पहली घटना को हटाने के लिए किया जाता है

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

अलग-अलग डेटा संरचनाओं पर किसी भी ऑपरेशन / फ़ंक्शन को विशेष कार्यों के लिए परिभाषित किया गया है। यहां आपके मामले में एक तत्व को हटाना यानी हटाना, पॉप करना और हटाना। (यदि आप सेट पर विचार करते हैं, तो एक और ऑपरेशन जोड़ें - त्यागें) जोड़ते समय अन्य भ्रामक मामला है। सम्मिलित करें / संलग्न। प्रदर्शन के लिए, हमें deque लागू करें। deque एक हाइब्रिड रैखिक डेटा संरचना है, जहाँ आप तत्वों को जोड़ सकते हैं / दोनों सिरों से तत्वों को निकाल सकते हैं। (रियर और फ्रंट एंड्स)

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

डेल बयान एक पूरी सूची को हटाने के लिए इस्तेमाल किया जा सकता। यदि आपके पास डेल के लिए अपने तर्क के रूप में एक विशिष्ट सूची आइटम है (जैसे सूचीनाम [7] विशेष रूप से सूची में 8 वें आइटम को संदर्भित करने के लिए), तो यह सिर्फ उस आइटम को हटा देगा। एक सूची से "स्लाइस" को हटाना भी संभव है। यह एक त्रुटि है अगर वहाँ सीमा से बाहर सूचकांक, एक IndexError उठाता है ।

>>> 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) की तुलना में बेहतर प्रदर्शन के साथ कतार संचालन प्रदान कर सकते हैं। यह एक त्रुटि है अगर वहाँ सीमा से बाहर सूचकांक, एक IndexError उठाता है ।

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

अधिक विवरण के लिए collection.deque देखें ।


-1

मूल्य पर मूल रूप से काम करता है निकालें। हटाएं और पॉप कार्य इंडेक्स पर करें

निकालें मूल रूप से पहला मिलान मूल्य निकालता है। हटाएं किसी विशिष्ट इंडेक्स से आइटम को हटाता है पॉप मूल रूप से एक इंडेक्स लेता है और उस इंडेक्स पर मान लौटाता है। अगली बार जब आप सूची को प्रिंट करते हैं तो मान दिखाई नहीं देता है।

उदाहरण:


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

-3

आप इंडेक्स द्वारा मान को हटाने के लिए रिमूव का भी उपयोग कर सकते हैं।

n = [1, 3, 5]

n.remove(n[1])

n तब [1, 5] को संदर्भित करेगा


43
कोशिश n = [5, 3, 5]तो करो n.remove(n[2])
१ert

@abertert आपके उपयोग के मामले में नीचे के मामले n = [5,3,5] के साथ काम करता है, फिर n.remove (5)। ये दोनों सूची से पहला सामना करने वाले तत्व को हटाते हैं।
अखिल घाटकी

@ अकीलघाटीकी n.remove(n[2])हटा n[0], नहीं n[2]। तो यह न सिर्फ रैखिक समय बिना किसी कारण के (नहीं एक बड़ी बात शायद जब एन = 3) है, यह भी गलत है (एक बड़ी बात कोई फर्क नहीं पड़ता एन क्या है)
abarnert
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.