अन्य लोगों की तरह पॉप और डेल दिए गए इंडेक्स के आइटम को हटाने के लिए कुशल तरीके हैं। अभी तक सिर्फ पूरा करने के लिए (चूंकि एक ही चीज़ पायथन में कई तरीकों से हो सकती है):
स्लाइस का उपयोग करना (यह मूल सूची से आइटम को हटाने के स्थान पर नहीं करता है):
(पायथन सूची के साथ काम करते समय यह भी कम से कम कुशल तरीका होगा, लेकिन यह उपयोगी हो सकता है (लेकिन कुशल नहीं, मैं दोहराता हूं) जब उपयोगकर्ता परिभाषित वस्तुओं के साथ काम करते हैं जो पॉप का समर्थन नहीं करते हैं, फिर भी परिभाषित करते हैं __getitem__
):
>>> a = [1, 2, 3, 4, 5, 6]
>>> index = 3 # Only positive index
>>> a = a[:index] + a[index+1 :]
# a is now [1, 2, 3, 5, 6]
नोट: कृपया ध्यान दें कि इस पद्धति की तरह सूची को संशोधित नहीं करता है pop
और del
। इसके बजाय सूचियों की दो प्रतियां बनाता है (एक शुरुआत से सूचकांक तक लेकिन इसके बिना a[:index]
) ( और अंतिम तत्व तक सूचकांक के बाद a[index+1:]
) ( और) दोनों को जोड़कर एक नई सूची ऑब्जेक्ट बनाता है। इसके बाद सूची चर ( a
) पर फिर से असाइन किया गया । पुरानी सूची ऑब्जेक्ट को इसलिए डिरेल्ड किया जाता है और इसलिए कचरा एकत्र किया जाता है (बशर्ते मूल सूची ऑब्जेक्ट को किसी अन्य चर द्वारा संदर्भित नहीं किया जाता है)।
यह इस पद्धति को बहुत अक्षम बनाता है और यह अवांछनीय दुष्प्रभाव भी पैदा कर सकता है (विशेषकर जब अन्य चर मूल सूची ऑब्जेक्ट जो अन-संशोधित रहता है) की ओर इशारा करते हैं।
इसे इंगित करने के लिए @MarkDickinson को धन्यवाद ...
यह स्टैक ओवरफ्लो उत्तर स्लाइसिंग की अवधारणा की व्याख्या करता है।
यह भी ध्यान दें कि यह केवल सकारात्मक सूचकांकों के साथ काम करता है।
वस्तुओं के साथ उपयोग करते समय, __getitem__
विधि को परिभाषित किया गया होगा और अधिक महत्वपूर्ण बात यह है कि __add__
विधि को दोनों ऑपरेंड से किसी वस्तु को वापस करने के लिए परिभाषित किया जाना चाहिए।
संक्षेप में, यह किसी भी वस्तु के साथ काम करता है जिसकी वर्ग परिभाषा इस प्रकार है:
class foo(object):
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return foo(self.items[index])
def __add__(self, right):
return foo( self.items + right.items )
यह list
किस परिभाषित __getitem__
और __add__
तरीकों से काम करता है ।
दक्षता के मामले में तीन तरीकों की तुलना:
मान लें कि निम्न पूर्वनिर्धारित है:
a = range(10)
index = 3
del object[index]
विधि:
अब तक की सबसे कुशल विधि। यह उन सभी वस्तुओं को काम करता है जो एक __del__
विधि को परिभाषित करते हैं ।
Disassembly इस प्रकार है:
कोड:
def del_method():
global a
global index
del a[index]
disassembly:
10 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 DELETE_SUBSCR # This is the line that deletes the item
7 LOAD_CONST 0 (None)
10 RETURN_VALUE
None
pop
तरीका:
यह डेल विधि की तुलना में कम कुशल है और इसका उपयोग तब किया जाता है जब आपको हटाए गए आइटम को प्राप्त करने की आवश्यकता होती है।
कोड:
def pop_method():
global a
global index
a.pop(index)
disassembly:
17 0 LOAD_GLOBAL 0 (a)
3 LOAD_ATTR 1 (pop)
6 LOAD_GLOBAL 2 (index)
9 CALL_FUNCTION 1
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
टुकड़ा और विधि जोड़ें।
सबसे कम कुशल।
कोड:
def slice_method():
global a
global index
a = a[:index] + a[index+1:]
disassembly:
24 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 SLICE+2
7 LOAD_GLOBAL 0 (a)
10 LOAD_GLOBAL 1 (index)
13 LOAD_CONST 1 (1)
16 BINARY_ADD
17 SLICE+1
18 BINARY_ADD
19 STORE_GLOBAL 0 (a)
22 LOAD_CONST 0 (None)
25 RETURN_VALUE
None
नोट: सभी तीन डिसएम्बेंबल में पिछली दो लाइनों को अनदेखा करते हैं जो मूल रूप से हैं return None
। इसके अलावा, पहली दो पंक्तियाँ वैश्विक मूल्यों को लोड कर रही हैं a
और index
।
O(n)
समय ऑपरेशन में है।deque()
दोनों सिरों पर कुशल संचालन प्रदान करता है लेकिन यह बीच में ओ (1) सम्मिलन / लुकअप / विलोपन प्रदान नहीं करता है।