ความแตกต่างระหว่าง del, remove และ pop on list


925
>>> 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 วิธีการใน Python?
RBT

คำตอบ:


1329

ใช่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
Martijn Pieters

6
เป็นเรื่องที่ควรกล่าวถึงว่าผู้ใช้ควรระมัดระวังในการวนซ้ำรายการและใช้งานฟังก์ชั่นเหล่านี้ในเวลาเดียวกันขณะที่กำลังทำซ้ำ
hamaney

16
delตัวอย่างค่อนข้างทำให้เข้าใจผิด องค์ประกอบใดที่ถูกลบอย่างแน่นอน? ที่ 2 หรือ 3? คุณควรจะได้ใช้[9, 8, 7, 6], del a[1]และ[9, 7, 6]
gromit190

2
@ rite2hhh ทดสอบความเท่าเทียมกัน การทดสอบความเท่าเทียมกันสำหรับข้อมูลเฉพาะตัวก่อนเป็นการเพิ่มประสิทธิภาพ
Martijn Pieters

1
@ rite2hhh: ค่าเท่าเทียมกันได้รับการคุ้มครองในการอ้างอิงการแสดงออก
Martijn Pieters

183

ใช้delเพื่อลบองค์ประกอบตามดัชนีpop()เพื่อลบออกโดยดัชนีหากคุณต้องการค่าที่ส่งคืนและremove()เพื่อลบองค์ประกอบตามค่า หลังต้องค้นหารายการและยกValueErrorหากไม่มีค่าดังกล่าวเกิดขึ้นในรายการ

เมื่อลบดัชนีiออกจากรายการnองค์ประกอบความซับซ้อนในการคำนวณของวิธีการเหล่านี้คือ

del     O(n - i)
pop     O(n - i)
remove  O(n)

1
ป๊อปต้องการการค้นหารายการหรือไม่
sachin irukula

31
+1 สำหรับการแยกย่อยความซับซ้อน แสดงให้เห็นว่าการลบและป๊อปคงที่เมื่อองค์ประกอบอยู่ที่ส่วนท้ายของรายการ
Big Sharpie

2
โปรดจำไว้ว่า ... ดัชนีอะไรก็ตามที่มีหนึ่งช็อต O (n-1) ... หากคุณต้องค้นหา (ตามค่า) มันจะเข้าไปในคอลเลคชั่นจนกว่าจะพบองค์ประกอบ
Pepito Fernandez

2
@PepitoFernandez การค้นหาตามดัชนีในรายการคือ O (1) ใน Python (รายการใน Python คล้ายกับเวกเตอร์ใน C ++.)
Sven Marnach

3
@PlasmaBinturong คุณควรใช้สิ่งที่คุณคิดว่าสามารถอ่านได้มากขึ้นเว้นแต่คุณจะมีข้อมูลที่พิสูจน์ว่าประสิทธิภาพมีความสำคัญ และถ้าคุณมีคุณต้องวัดว่าอะไรเร็วขึ้นในกรณีเฉพาะของคุณ ฉันเดาว่ามันก็delเร็วขึ้นเล็กน้อย แต่ด้วยเหตุผลที่ต่างออกไป: การค้นหา__delitem__ประเภทที่เกิดขึ้นใน C เกิดขึ้นจากดัชนีมากกว่าตามชื่อในขณะที่popต้องค้นหาตามโปรโตคอลตัวอธิบายทั้งหมด การดำเนินการของฟังก์ชันเองควรใช้เวลาเท่ากัน ทั้งสองส่งกลับตัวชี้ - หนึ่งไปยังวัตถุที่ถูกลบออกไปNoneอีก
Sven Marnach

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

ตอบโดยคนอื่นค่อนข้างดี อันนี้จากปลายฉัน :)

ลบ vs pop vs del

เห็นได้ชัดว่าpopเป็นเพียงคนเดียวที่ส่งกลับค่าและremoveเป็นคนเดียวที่ค้นหาวัตถุในขณะที่delจำกัด ตัวเองเพื่อการลบง่าย


2
ขอบคุณ! หมายเหตุหนึ่ง: ในไพ ธ อนเนื่องจากวิธีการนำรายการไปใช้งาน (มีอาร์เรย์จริง ... !) "เลื่อนไปจนถึงตำแหน่งโหนด" คือ O (1)
ntg

19

คำอธิบายที่ดีที่สุดมากมายอยู่ที่นี่ แต่ฉันจะพยายามทำให้ดีขึ้นเพื่อให้ง่ายขึ้น

ในบรรดาวิธีการเหล่านี้ทั้งหมดย้อนกลับและปรากฏเป็น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

หวังว่านี่จะทำให้เกิดความสับสนหากมี


18

ป๊อป - รับดัชนีและคืนค่า

ลบ - รับค่าลบสิ่งที่เกิดขึ้นครั้งแรกและส่งคืนอะไร

ลบ - ใช้ดัชนีลบค่าที่ดัชนีนั้นและไม่ส่งคืนอะไร


2

การดำเนินการ / ฟังก์ชั่นใด ๆ ในโครงสร้างข้อมูลที่แตกต่างกันมีการกำหนดไว้สำหรับการกระทำเฉพาะ ในกรณีของคุณเช่นลบองค์ประกอบ, ลบ, ป๊อปและลบ (หากคุณพิจารณาตั้งค่าให้เพิ่มการดำเนินการอื่น - ยกเลิก) กรณีที่สับสนอื่น ๆ อยู่ในขณะที่เพิ่ม แทรก / ผนวก สำหรับการสาธิตขอให้เรานำไปปฏิบัติ 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
    

ส่งคืน [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

ขณะที่ป๊อปและลบทั้งคู่ใช้ดัชนีเพื่อลบองค์ประกอบตามที่ระบุไว้ในความคิดเห็นด้านบน ความแตกต่างที่สำคัญคือความซับซ้อนของเวลาสำหรับพวกเขา ความซับซ้อนของเวลาสำหรับป๊อป () ที่ไม่มีดัชนีคือ O (1) แต่ไม่ใช่กรณีเดียวกันสำหรับการลบองค์ประกอบสุดท้าย

หากกรณีการใช้งานของคุณลบองค์ประกอบสุดท้ายเสมอก็ควรใช้ pop () มากกว่า delete () สำหรับคำอธิบายเพิ่มเติมเกี่ยวกับความซับซ้อนของเวลาคุณสามารถดู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

เดลคำสั่งที่สามารถใช้ในการลบรายชื่อทั้งหมด หากคุณมีรายการเฉพาะเป็นอาร์กิวเมนต์ของคุณที่จะลบ (เช่น 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สำหรับรายละเอียดเพิ่มเติม


-1

ลบโดยทั่วไปทำงานบนค่า ลบและ pop ทำงานกับดัชนี

ลบโดยทั่วไปจะลบค่าการจับคู่แรก ลบลบรายการออกจากดัชนีเฉพาะ Pop โดยทั่วไปจะใช้ดัชนีและส่งคืนค่าที่ดัชนีนั้น ครั้งต่อไปที่คุณพิมพ์รายการค่าจะไม่ปรากฏขึ้น

ตัวอย่าง:


3
แม้ว่าเราจะขอบคุณสำหรับคำตอบของคุณมันจะดีกว่าถ้ามันให้คุณค่าเพิ่มเติมกับคำตอบอื่น ๆ ในกรณีนี้คำตอบของคุณไม่ได้ให้คุณค่าเพิ่มเติมเนื่องจากผู้ใช้รายอื่นครอบคลุมทุกอย่างที่คุณได้รวมไว้ในคำตอบของคุณ ในฐานะที่เป็นปัญหารองโปรดอย่ารวมข้อความเป็นรูปภาพเมื่อคุณสามารถวางเป็นข้อความได้ หากคำตอบที่ก่อนหน้านี้เป็นประโยชน์กับคุณคุณควรลงคะแนนเสียงมันขึ้น
David Buck

-3

นอกจากนี้คุณยังสามารถใช้ remove เพื่อลบค่าตามดัชนีเช่นกัน

n = [1, 3, 5]

n.remove(n[1])

n จะอ้างถึง [1, 5]


43
ลองแล้วn = [5, 3, 5] n.remove(n[2])
abarnert

@ รวมการใช้งานกรณีการใช้งานของคุณให้ตรงกับกรณีด้านล่าง n = [5,3,5] จากนั้นลบ n.remove (5) ทั้งสองนี้ลบองค์ประกอบที่พบครั้งแรกจากรายการ
Akhil Ghatiki

@AkhilGhatiki n.remove(n[2])ลบไม่ได้n[0] n[2]ดังนั้นมันไม่ใช่แค่เวลาเชิงเส้นโดยไม่มีเหตุผล (อาจไม่ใช่เรื่องใหญ่เมื่อ N = 3) มันก็ผิด (เรื่องใหญ่ไม่ว่า N คืออะไร)
abarnert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.