목록에서 델, 제거 및 팝의 차이점


답변:


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는 구문 유지가 아닙니다. 구문은 returnor if또는 처럼 변하지 않습니다 while.
Martijn Pieters

6
목록을 반복하고 반복하면서 동시에이 기능을 사용할 때 사용자는주의해야합니다.
hamaney

16
del예는 다소 오해의 소지가 있습니다. 정확히 어떤 요소가 제거됩니까? 두 번째 또는 세 번째? 당신은 사용해야 [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
pop리스트를 검색해야합니까
sachin irukula

31
복잡도 분석 +1 요소가 목록의 끝에있을 때 delete 및 pop이 일정한 방법을 보여줍니다.
Big Sharpie

2
녀석을 기억하십시오 ... 색인 기반의 것은 O (n-1)입니다 ... 값으로 조회 해야하는 경우 요소를 찾을 때까지 컬렉션을 탐색합니다.
Pepito Fernandez

2
@PepitoFernandez 목록의 색인 별 조회는 Python에서 O (1)입니다. (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

이미 다른 사람들이 잘 대답했습니다. 내 끝 에서이 하나 :)

팝 대 델을 제거

분명히 pop값을 반환하는 remove유일한 개체이며 개체를 검색하는 유일한 개체이며 del간단한 삭제로 제한됩니다.


2
Thnx! 한가지주의 사항 : 파이썬에서,리스트가 구현되는 방식으로 인해 (실제로 배열이 있습니다 ...!), "해당 노드 위치까지의 전진"은 O (1)
ntg

19

많은 최고의 설명이 여기 있지만 더 단순화하기 위해 최선을 다할 것입니다.

이러한 모든 방법 중에서 reverse & pop은 postfix 이고 delete는 prefix 입니다.

remove () : 처음 나타나는 원소를 제거하는 데 사용

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]

경고 : 위험한 방법

delete () : 접두사 메서드입니다.

동일한 방법에 대해 두 가지 다른 구문 인 []와 ()를 주시하십시오. 그것은 다음과 같은 힘을 가지고 있습니다.

1. 인덱스 삭제

del a[index] => pop과 같이 인덱스와 관련 값을 삭제하는 데 사용됩니다.

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]

2. [index 1 : index N] 범위의 값 삭제

del a[0:3] => 범위의 여러 값

>>>del a[0:3]
>>>a
[6, 5]

3. 마지막이지만 목록이 아닌 전체 목록을 한 번에 삭제

del (a) => 위에서 말했듯이.

>>>del (a)
>>>a

이것이 혼란을 명확히하기를 바랍니다.


18

pop-인덱스를 가져 와서 Value를 돌려줍니다

remove-값을 취하고 첫 번째 발생을 제거하며 아무것도 리턴하지 않습니다.

delete-인덱스를 가져와 해당 인덱스에서 값을 제거하고 아무것도 반환하지 않습니다.


2

다른 데이터 구조에 대한 모든 작업 / 기능은 특정 작업에 대해 정의됩니다. 귀하의 경우에는 요소를 제거하고 삭제하고 팝하고 제거하십시오. (세트를 고려하면 다른 작업 추가-삭제) 다른 혼란스러운 사례는 추가하는 동안입니다. 삽입 / 추가. 데모를 위해 deque를 구현하자. 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()

작업은 무언가를 반환해야합니다. 그래서, 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

pop과 delete는 위의 주석에서 언급 한 것처럼 요소를 제거하기 위해 인덱스를 가져옵니다. 중요한 차이점은 시간 복잡성입니다. 인덱스가없는 pop ()의 시간 복잡도는 O (1)이지만 마지막 요소를 삭제하는 경우와 동일하지 않습니다.

사용 사례가 항상 마지막 요소를 삭제하는 경우 항상 delete ()보다 pop ()을 사용하는 것이 좋습니다. 시간 복잡성에 대한 자세한 설명은 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

문 전체 목록을 삭제하는 데 사용할 수 있습니다. del에 대한 인수로 특정 목록 항목이있는 경우 (예 : 목록에서 8 번째 항목을 구체적으로 참조하기 위해 listname [7]) 해당 항목 만 삭제합니다. 목록에서 "슬라이스"를 삭제할 수도 있습니다. 범위를 벗어난 인덱스가 있으면 오류가 발생하고 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)은 목록에서 첫 번째 항목을 삭제하고 그 첫 번째 항목을 결과로 반환합니다). 이것을 사용하여 목록을 대기열처럼 작동하게 만들 수 있지만 pop (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

자세한 내용은 collections.deque 를 참조하십시오.


-1

기본적으로 값을 제거합니다. 색인에 대한 삭제 및 팝 작업

기본적으로 제거는 첫 번째 일치 값을 제거합니다. Delete는 특정 인덱스에서 항목을 삭제합니다. 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

@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.