අනෙක් අය වගේ පොප් සඳහන් කර ඇති අතර ඩෙල් වේ ද ලබා දී දර්ශකයේ අයිතමය ඉවත් කිරීමට කාර්යක්ෂම ක්රම. එහෙත් සම්පූර්ණ කිරීම සඳහා (පයිතන්හි එකම දේ බොහෝ ආකාරවලින් කළ හැකි බැවින්):
පෙති භාවිතා කිරීම (මෙය මුල් ලැයිස්තුවෙන් අයිතමය ඉවත් කිරීම සිදු නොකරයි):
(එසේම මෙය පයිතන් ලැයිස්තුව සමඟ වැඩ කිරීමේදී අවම කාර්යක්ෂම ක්රමයක් වනු ඇත, නමුත් පොප් සඳහා සහය නොදක්වන පරිශීලක අර්ථ දක්වන ලද වස්තූන් සමඟ වැඩ කිරීමේදී මෙය ප්රයෝජනවත් විය හැකිය (නමුත් කාර්යක්ෂම නොවේ, මම නැවත අවධාරණය කරමි __getitem__
): a යන්න අර්ථ දක්වන්න ):
>>> 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
) නැවත පවරනු ලැබේ . එබැවින් පැරණි ලැයිස්තු වස්තුව අවලංගු කර ඇති අතර එම නිසා කසළ එකතු කරනු ලැබේ (මුල් ලැයිස්තු වස්තුව a හැර වෙනත් විචල්යයකින් සඳහන් නොවේ නම්).
මෙම ක්රමය ඉතා අකාර්යක්ෂම වන අතර එයට අනවශ්ය අතුරු ආබාධ ඇති කළ හැකිය (විශේෂයෙන් වෙනත් විචල්යයන් වෙනස් නොකළ මුල් ලැයිස්තු වස්තුව වෙත යොමු කරන විට).
මෙය පෙන්වා දීම ගැන ark මාක් ඩිකින්සන්ට ස්තූතියි ...
මෙම සිරස් පිටාර ගැලීමේ පිළිතුර පෙති කැපීමේ සංකල්පය පැහැදිලි කරයි.
මෙය ක්රියාත්මක වන්නේ ධනාත්මක දර්ශක සමඟ පමණක් බව සලකන්න.
වස්තූන් සමඟ භාවිතා කරන අතරතුර, __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]
විසුරුවා හැරීම:
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)
විසුරුවා හැරීම:
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:]
විසුරුවා හැරීම:
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()
දෙපසම කාර්යක්ෂම මෙහෙයුම් සපයන නමුත් එය O (1) මැදට ඇතුළු කිරීම් / බැලීම් / මකාදැමීම් සපයන්නේ නැත.