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


답변:


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.