>>> 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]
>>>
มีความแตกต่างระหว่างสามวิธีข้างต้นในการลบองค์ประกอบออกจากรายการหรือไม่?
>>> 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]
>>>
มีความแตกต่างระหว่างสามวิธีข้างต้นในการลบองค์ประกอบออกจากรายการหรือไม่?
คำตอบ:
ใช่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
del
ไม่ใช่การครอบครองไวยากรณ์ไม่ใช่ ไวยากรณ์ไม่เปลี่ยนแปลงเช่นเดียวreturn
หรือหรือif
while
del
ตัวอย่างค่อนข้างทำให้เข้าใจผิด องค์ประกอบใดที่ถูกลบอย่างแน่นอน? ที่ 2 หรือ 3? คุณควรจะได้ใช้[9, 8, 7, 6]
, del a[1]
และ[9, 7, 6]
ใช้del
เพื่อลบองค์ประกอบตามดัชนีpop()
เพื่อลบออกโดยดัชนีหากคุณต้องการค่าที่ส่งคืนและremove()
เพื่อลบองค์ประกอบตามค่า หลังต้องค้นหารายการและยกValueError
หากไม่มีค่าดังกล่าวเกิดขึ้นในรายการ
เมื่อลบดัชนีi
ออกจากรายการn
องค์ประกอบความซับซ้อนในการคำนวณของวิธีการเหล่านี้คือ
del O(n - i)
pop O(n - i)
remove O(n)
del
เร็วขึ้นเล็กน้อย แต่ด้วยเหตุผลที่ต่างออกไป: การค้นหา__delitem__
ประเภทที่เกิดขึ้นใน C เกิดขึ้นจากดัชนีมากกว่าตามชื่อในขณะที่pop
ต้องค้นหาตามโปรโตคอลตัวอธิบายทั้งหมด การดำเนินการของฟังก์ชันเองควรใช้เวลาเท่ากัน ทั้งสองส่งกลับตัวชี้ - หนึ่งไปยังวัตถุที่ถูกลบออกไปNone
อีก
เนื่องจากไม่มีใครได้กล่าวถึงโปรดทราบว่า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]
ตอบโดยคนอื่นค่อนข้างดี อันนี้จากปลายฉัน :)
เห็นได้ชัดว่าpop
เป็นเพียงคนเดียวที่ส่งกลับค่าและremove
เป็นคนเดียวที่ค้นหาวัตถุในขณะที่del
จำกัด ตัวเองเพื่อการลบง่าย
คำอธิบายที่ดีที่สุดมากมายอยู่ที่นี่ แต่ฉันจะพยายามทำให้ดีขึ้นเพื่อให้ง่ายขึ้น
ในบรรดาวิธีการเหล่านี้ทั้งหมดย้อนกลับและปรากฏเป็นpostfixขณะที่ลบเป็นคำนำหน้า
ลบ ():มันใช้เพื่อลบการเกิดขึ้นครั้งแรกขององค์ประกอบ
remove(i)
=> การเกิดขึ้นครั้งแรกของค่า 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 ():มันใช้เพื่อลบองค์ประกอบหาก:
ยังไม่ระบุ
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: ดัชนี N]
del a[0:3]
=> หลายค่าในช่วง
>>>del a[0:3]
>>>a
[6, 5]
3. สุดท้าย แต่ไม่ใช่รายการเพื่อลบรายการทั้งหมดในนัดเดียว
del (a)
=> ดังกล่าวข้างต้น
>>>del (a)
>>>a
หวังว่านี่จะทำให้เกิดความสับสนหากมี
ป๊อป - รับดัชนีและคืนค่า
ลบ - รับค่าลบสิ่งที่เกิดขึ้นครั้งแรกและส่งคืนอะไร
ลบ - ใช้ดัชนีลบค่าที่ดัชนีนั้นและไม่ส่งคืนอะไร
การดำเนินการ / ฟังก์ชั่นใด ๆ ในโครงสร้างข้อมูลที่แตกต่างกันมีการกำหนดไว้สำหรับการกระทำเฉพาะ ในกรณีของคุณเช่นลบองค์ประกอบ, ลบ, ป๊อปและลบ (หากคุณพิจารณาตั้งค่าให้เพิ่มการดำเนินการอื่น - ยกเลิก) กรณีที่สับสนอื่น ๆ อยู่ในขณะที่เพิ่ม แทรก / ผนวก สำหรับการสาธิตขอให้เรานำไปปฏิบัติ 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()
การดำเนินงานต้องส่งคืนบางสิ่ง ดังนั้นป๊อป - มีและไม่มีดัชนี หากฉันไม่ต้องการส่งคืนค่า: del self.items [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
ให้เราพิจารณากรณีของชุด
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.
ขณะที่ป๊อปและลบทั้งคู่ใช้ดัชนีเพื่อลบองค์ประกอบตามที่ระบุไว้ในความคิดเห็นด้านบน ความแตกต่างที่สำคัญคือความซับซ้อนของเวลาสำหรับพวกเขา ความซับซ้อนของเวลาสำหรับป๊อป () ที่ไม่มีดัชนีคือ O (1) แต่ไม่ใช่กรณีเดียวกันสำหรับการลบองค์ประกอบสุดท้าย
หากกรณีการใช้งานของคุณลบองค์ประกอบสุดท้ายเสมอก็ควรใช้ pop () มากกว่า delete () สำหรับคำอธิบายเพิ่มเติมเกี่ยวกับความซับซ้อนของเวลาคุณสามารถดูhttps://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
delete
ไม่มีวิธีการดังกล่าวเป็น ความแตกต่างคือการpop
คืนค่าและที่del
ทำงานบนชิ้น ในกรณีที่การpop
ทำงานdel
มีความซับซ้อนในการคำนวณเหมือนกัน (และเร็วกว่าเล็กน้อยในระยะค่าคงที่)
การดำเนินการลบในรายการจะได้รับค่าที่จะลบ มันจะค้นหารายการเพื่อค้นหารายการที่มีค่านั้นและลบรายการที่ตรงกันแรกที่พบ มันเป็นข้อผิดพลาดถ้าไม่มีรายการที่ตรงกัน, ยก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
เดลคำสั่งที่สามารถใช้ในการลบรายชื่อทั้งหมด หากคุณมีรายการเฉพาะเป็นอาร์กิวเมนต์ของคุณที่จะลบ (เช่น listname [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
การใช้งานป๊อปตามปกติคือการลบรายการสุดท้ายออกจากรายการในขณะที่คุณใช้รายการเป็นสแต็ก ซึ่งแตกต่างจาก del, pop ส่งคืนค่าที่แตกออกจากรายการ คุณสามารถเลือกที่จะให้ค่าดัชนีเป็นแบบ pop และ pop จากส่วนอื่นนอกเหนือจากส่วนท้ายของรายการ (เช่น 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สำหรับรายละเอียดเพิ่มเติม
ลบโดยทั่วไปทำงานบนค่า ลบและ pop ทำงานกับดัชนี
ลบโดยทั่วไปจะลบค่าการจับคู่แรก ลบลบรายการออกจากดัชนีเฉพาะ Pop โดยทั่วไปจะใช้ดัชนีและส่งคืนค่าที่ดัชนีนั้น ครั้งต่อไปที่คุณพิมพ์รายการค่าจะไม่ปรากฏขึ้น
นอกจากนี้คุณยังสามารถใช้ remove เพื่อลบค่าตามดัชนีเช่นกัน
n = [1, 3, 5]
n.remove(n[1])
n จะอ้างถึง [1, 5]
n = [5, 3, 5]
n.remove(n[2])
n.remove(n[2])
ลบไม่ได้n[0]
n[2]
ดังนั้นมันไม่ใช่แค่เวลาเชิงเส้นโดยไม่มีเหตุผล (อาจไม่ใช่เรื่องใหญ่เมื่อ N = 3) มันก็ผิด (เรื่องใหญ่ไม่ว่า N คืออะไร)