পপ মত অন্যদের উল্লেখ এবং দেল হয় দেওয়া সূচক একটি আইটেম মুছে ফেলার জন্য দক্ষ উপায়ে। তবুও কেবল সমাপ্তির খাতিরে (যেহেতু পাইথনের বিভিন্ন উপায়ে একই জিনিসটি করা যেতে পারে):
স্লাইস ব্যবহার করে (এটি মূল তালিকা থেকে আইটেমটি সরিয়ে ফেলার জায়গায় করে না):
(এছাড়াও পাইথন তালিকার সাথে কাজ করার সময় এটি সর্বনিম্ন কার্যকর পদ্ধতি হবে, তবে পপ সমর্থন করে না এমন ব্যবহারকারী সংজ্ঞায়িত অবজেক্টের সাথে কাজ করার সময় এটি কার্যকর হতে পারে (তবে দক্ষ নয়, আমি পুনরায় বলি) __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
) এ পুনরায় নিয়োগ দেওয়া হয় । পুরাতন তালিকার অবজেক্টটি তাই বিবেচ্য এবং তাই আবর্জনা সংগ্রহ করা (মূল তালিকার অবজেক্টটি এ ছাড়া অন্য কোনও চলক দ্বারা রেফারেন্স না দেওয়া হয়)।
এটি এই পদ্ধতিটিকে খুব অদক্ষ করে তোলে এবং এটি অনাকাঙ্ক্ষিত পার্শ্ব প্রতিক্রিয়াও তৈরি করতে পারে (বিশেষত যখন অন্যান্য পরিবর্তনকগুলি মূল তালিকা অবজেক্টের দিকে ইঙ্গিত করে যা অ-সংশোধিত থাকে)।
এটি নির্দেশ করার জন্য @ মার্কডিকিনসনকে ধন্যবাদ ...
এই স্ট্যাক ওভারফ্লো উত্তর স্লাইসিংয়ের ধারণাটি ব্যাখ্যা করে।
আরও মনে রাখবেন যে এটি কেবল ইতিবাচক সূচকগুলির সাথেই কাজ করে।
অবজেক্টের সাথে ব্যবহার করার সময়, __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__
পদ্ধতির সংজ্ঞা দেয় ।
বিচ্ছিন্নতা নিম্নরূপ:
কোড:
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
দ্রষ্টব্য: সব তিনটি disassembles গত দুই লাইন যা মূলত হয় উপেক্ষা করা return None
। এছাড়াও প্রথম দুটি লাইন গ্লোবাল মানগুলি লোড করছে a
এবং index
।
O(n)
সময়টি কার্যকর করার কারণে ব্যবধানটি সরাতে ডানদিকে সমস্ত আইটেম সরিয়ে নিতে হবে ।deque()
উভয় প্রান্তে দক্ষ ক্রিয়াকলাপ সরবরাহ করে তবে এটি ও (1) সন্নিবেশ / লুকআপ / মোছার মাঝখানে সরবরাহ করে না।