색인으로 목록에서 요소를 제거하는 방법


1503

파이썬에서 색인으로 목록에서 요소를 어떻게 제거합니까?

list.remove방법을 찾았 지만 마지막 요소를 제거하고 싶다고 어떻게 말합니까? 기본 제거가 목록을 검색하는 것처럼 보이지만 검색을 수행하고 싶지 않습니다.


10
@ smci : Python 목록은 배열 기반입니다. 중간에있는 항목을 삭제하려면 오른쪽에있는 모든 항목을 이동 O(n)하여 시간 작업 인 이유를 제거해야 합니다. deque()양쪽 끝에 효율적인 작업을 제공하지만 중간에 O (1) 삽입 / 조회 / 삭제를 제공하지 않습니다.
jfs

@ JFSebastian : cPython 구현, 예, 수정 해 주셔서 감사합니다. 엄밀히 말하면 언어 사양 은 목록을 구현하는 방법을 지정하지 않으며 대체 구현에서는 연결된 목록을 사용하도록 선택할 수 있습니다.
smci

@smci : 실제 파이썬 구현 에서는 링크 목록으로 인해 O(n)인덱스 액세스를 사용하지 않습니다 a[i]. 참고 : 배열 기반 구현은 O(1)인덱스 액세스를 제공 합니다.
jfs

@JFSebastian : 물론입니다. 나는 언어 사양이 이것을 정의하지 않으며 구현 문제라고 지적했습니다. (그렇지 않았다는 사실에 놀랐습니다.)
smci

@smci 광범위하게 타겟팅하는 경우 어떻게 최적화 할 수 있는지 잘 모르겠습니다.
Nick T

답변:


1740

del삭제하려는 요소의 색인을 사용 하고 지정하십시오.

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[-1]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8]

슬라이스도 지원합니다.

>>> del a[2:4]
>>> a
[0, 1, 4, 5, 6, 7, 8, 9]

다음 은 튜토리얼의 섹션입니다.


53
고마워, 팝과 델의 차이점은 무엇입니까?
Joan Venge

37
del이 오버로드되었습니다. 예를 들어 del a는 전체 목록을 삭제합니다.
Brian R. Bondy

34
다른 예 del a [2 : 4], 요소 2 및 3 삭제
Brian R. Bondy

307
pop ()은 제거하려는 요소를 반환합니다. 델은 그냥 삭제합니다.

13
거기에 "연결된 목록"의 증거가 보이지 않습니다. svn.python.org/projects/python/trunk/Objects/listobject.c 에서 배열 의 th 요소 인 PyList_GetItem()본질적으로 어떻게 리턴 되는지 보십시오 . ((PyListObject *)op) -> ob_item[i];i
glglgl

648

당신은 아마 원할 것입니다 pop:

a = ['a', 'b', 'c', 'd']
a.pop(1)

# now a is ['a', 'c', 'd']

기본적으로 pop인수가 없으면 마지막 항목이 제거됩니다.

a = ['a', 'b', 'c', 'd']
a.pop()

# now a is ['a', 'b', 'c']

105
pop (-1)을 잊지 마십시오. 예, 기본 설정이지만 선호하므로 기본적으로 어떤 엔드 팝이 사용되는지 기억하지 않아도됩니다.
S.Lott

282
동의하지 않습니다. 프로그래머의 "pop"의 어원 ( '스택'데이터 구조 의 상단 을 제거하고 반환하는 작업 임)을 알고 있다면 pop()그 자체가 매우 명백한 반면, 중복되어 있기 때문에pop(-1) 정확하게 혼동 될 수 있습니다.
coredumperror

a.pop (-1)을 사용하여 마지막 것을 제거 하시겠습니까?
zx1986

14
@ zx1986 a pop는 대부분의 프로그래밍 언어에서 일반적으로 Python에서와 마찬가지로 마지막 항목을 제거합니다. 따라서 -1을 지정하거나 아무것도 지정하지 않아도됩니다.
파스칼

30
그건 그렇고, pop()제거 된 요소를 반환합니다.
Bob Stein이

136

다른 사람이 언급 한 것처럼 팝업 델은 지정된 인덱스의 항목을 제거하는 효율적인 방법. 그러나 완성을 위해서만 (파이썬에서 여러 가지 방법으로 같은 일을 할 수 있기 때문에) :

슬라이스 사용 (원본 목록에서 항목을 제자리에 제거하지는 않음) :

(이것은 Python 목록으로 작업 할 때 가장 효율적인 방법 일지 모르지만 pop을 지원하지 않지만 사용자 정의 객체를 사용하여 작업 할 때 유용 할 수는 있지만 효율적이지 않습니다 __getitem__.

>>> 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]

참고 : 이 방법은 popand과 같은 위치에서 목록을 수정하지 않습니다 del. 대신 목록의 사본 두 개 (처음부터 색인까지 ( a[:index]) , 색인없이 ( ), 마지막 요소까지 색인 ( a[index+1:]))) 두 개를 모두 추가하여 새 목록 객체를 만듭니다. 그런 다음 목록 변수 ( a)에 다시 할당됩니다 . 따라서 이전 목록 객체는 역 참조되어 가비지 수집됩니다 (원래 목록 객체가 a 이외의 변수에 의해 참조되지 않은 경우).

이 방법을 사용하면 효율성이 떨어지고 바람직하지 않은 부작용이 발생할 수 있습니다 (특히 다른 변수가 수정되지 않은 원래 목록 개체를 가리키는 경우).

이것을 지적 해준 @MarkDickinson에게 감사합니다 ...

스택 오버플로 답변은 슬라이싱 개념을 설명합니다.

또한 이는 긍정적 인 지수에서만 작동합니다.

객체와 함께 사용하는 동안 __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 방법:

del 방법보다 효율성이 떨어지며 삭제 된 항목을 가져와야 할 때 사용됩니다.

암호:

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.


4
귀하의 슬라이싱 방법은 목록에서 요소를 제거하지 않습니다 : 대신은 생성 새로운 모두를 포함하는 목록 개체하지만 원래 목록에서 i 번째 항목을. 원본 목록은 수정되지 않은 상태로 유지됩니다.
Mark Dickinson

@MarkDickinson 같은 내용을 명확하게하기 위해 답을 편집 했습니까? 지금보기 좋습니까?
Raghav RV

6
대답이 전적으로 주제에 관한 것은 아니지만 인덱싱 방법은 튜플과 같은 변경 불가능한 객체에서 항목을 생략 해야하는 경우 유용합니다. 이 경우 pop () 및 del ()이 작동하지 않습니다.
Caleb

6
전체 게시물 동안 제시된 모든 방법 중 @ rvraghav93에서 a = a[:index] + a[index+1 :]-trick은 거대한 목록에 관해서는 가장 절약되었습니다. 다른 모든 방법은 교착 상태에 빠졌습니다. 정말 감사합니다
user3085931

3
실제로 마크, 당신은 심술 are 다. 이 답변은 내가 실제로 교육 적이기 때문에 내가 선호하는 답변입니다. 나는이 답변과 제공된 해체 세부 사항 및 성능에 미치는 영향을 통해 대부분을 배웠습니다. 또한 슬라이싱 방법을 사용하면 다른 객체를 만들 수 있지만 이제는 객체가 지정되어 때로는 필요합니다.
Yohan Obadia

52

pop또한 목록에서 항목을 제거하고 유지하는 데 유용합니다. del실제로 쓰레기를 버리는 곳 .

>>> x = [1, 2, 3, 4]

>>> p = x.pop(1)
>>> p
    2

24

목록에서 특정 위치 요소 (예 : 2, 3, 7)를 제거하려는 경우 당신은 사용할 수 없습니다

del my_list[2]
del my_list[3]
del my_list[7]

두 번째 요소를 삭제 한 후 실제로 삭제하는 세 번째 요소는 원래 목록의 네 번째 요소입니다. 원본 목록에서 2, 3, 7 번째 요소를 필터링하고 아래와 같이 새 목록을 얻을 수 있습니다.

new list = [j for i, j in enumerate(my_list) if i not in [2, 3, 7]]

19

이것은 당신이하고 싶은 것에 달려 있습니다.

제거한 요소를 반환하려면 pop()다음을 사용하십시오 .

>>> l = [1, 2, 3, 4, 5]
>>> l.pop(2)
3
>>> l
[1, 2, 4, 5]

그러나 요소를 삭제하려면 del다음을 사용하십시오 .

>>> l = [1, 2, 3, 4, 5]
>>> del l[2]
>>> l
[1, 2, 4, 5]

또한 del슬라이스 (예 :)를 사용할 수 있습니다 del[2:].


18

일반적으로 다음 방법을 사용하고 있습니다.

>>> myList = [10,20,30,40,50]
>>> rmovIndxNo = 3
>>> del myList[rmovIndxNo]
>>> myList
[10, 20, 30, 50]

15

인덱스로 목록에서 요소를 제거하는 또 다른 방법입니다.

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# remove the element at index 3
a[3:4] = []
# a is now [0, 1, 2, 4, 5, 6, 7, 8, 9]

# remove the elements from index 3 to index 6
a[3:7] = []
# a is now [0, 1, 2, 7, 8, 9]

a [x : y]는 index에서 x로의 요소를 가리 킵니다 y-1. 목록의 해당 부분을 빈 목록 ( []) 으로 선언하면 해당 요소가 제거됩니다.


14

삭제하려는 항목 만 검색하면됩니다. 정말 간단합니다. 예:

    letters = ["a", "b", "c", "d", "e"]
    letters.remove(letters[1])
    print(*letters) # Used with a * to make it unpack you don't have to (Python 3.x or newer)

출력 : acde


6
나는이 솔루션을 좋아하지만 물론 목록에 중복이 없다고 가정합니다.
tommy.carstensen

11

다음 코드를 사용하여 목록에서 요소를 제거하십시오.

list = [1, 2, 3, 4]
list.remove(1)
print(list)

output = [2, 3, 4]

목록에서 색인 요소 데이터를 제거하려면 다음을 사용하십시오.

list = [1, 2, 3, 4]
list.remove(list[2])
print(list)
output : [1, 2, 4]

2
목록에는 중복 항목이 포함될 수 없다는 경고가 있습니다.
tommy.carstensen

3
이것은 인덱스로 제거하는 것이 아니라 일치하는 값으로 제거하는 것입니다. 여기를 방문하는 일부 사람들에게는 귀중한 정보 일 수 있지만 OP 질문에 전혀 대답하지 않습니다.
Anthon

8

앞에서 언급했듯이 모범 사례는 del ()입니다. 값을 알아야하는 경우 pop ()

다른 해결책은 원하는 요소 만 다시 쌓는 것입니다.

    a = ['a', 'b', 'c', 'd'] 

    def remove_element(list_,index_):
        clipboard = []
        for i in range(len(list_)):
            if i is not index_:
                clipboard.append(list_[i])
        return clipboard

    print(remove_element(a,2))

    >> ['a', 'b', 'd']

eta : hmm ...는 음의 인덱스 값에서 작동하지 않으며, 숙고하고 업데이트합니다.

나는 생각

if index_<0:index_=len(list_)+index_

그것을 패치 할 것입니다 ...하지만 갑자기이 아이디어는 매우 부서지기 쉬운 것 같습니다. 재미있는 생각 실험. append () / list comprehension으로 이것을 수행하는 '적절한'방법이 있어야합니다.

숙고하다


1
어떤 버전의 Python이 함수를 가지고 del()있습니까? 해당 함수의 경우 목록을 해당 함수의 첫 번째 인수로 제공 한 다음 색인 또는 색인을 먼저 제공 한 다음 목록으로 제공합니까? 항목없이 목록 인수를 반환하거나 삭제를 수행합니까? 나는 del진술 에 대해 알고 있지만 같은 이름을 가진 함수에 대해서는 모른다 .
Anthon

8

목록 목록으로 작업하는 것처럼 들리지 않으므로 짧게 유지하겠습니다. pop은 목록이 아닌 요소가 아닌 요소를 제거하므로 pop을 사용하려면 del을 사용해야합니다. 파이썬에서 마지막 요소를 호출하려면 "-1"입니다

>>> test = ['item1', 'item2']
>>> test.pop(-1)
'item2'
>>> test
['item1']

1
pop()그리고 del모두 그 요소가리스트 자체인지 여부와 무관 제공된 인덱스 요소를 제거한다. a = [1, [2, 3], 4]; del a[1]; b = [1, [2, 3], 4]; b.pop(1); assert a == b
Anthon

8

l- 값 목록; inds2rem 리스트 에서 인덱스를 제거 해야 합니다.

l = range(20)
inds2rem = [2,5,1,7]
map(lambda x: l.pop(x), sorted(inds2rem, key = lambda x:-x))

>>> l
[0, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

작동하지 않으면 대답은 <map at 0x7f4d54109a58>입니다. l은 range (0,20)
Hitesh

7

"del" 기능을 사용하십시오 .

del listName[-N]

예를 들어, 마지막 3 개 항목을 제거하려면 코드는 다음과 같아야합니다.

del listName[-3:]

예를 들어, 마지막 8 개 항목을 제거하려면 코드는 다음과 같아야합니다.

del listName[-8:]

2
delA는 . 함수라면 다음과 같이 작성해야합니다.del(listame[-N])
Anthon

7

목록에서 단일 요소를 제거하는 방법과 다른 방법의 장점을 이미 언급했습니다. 그러나 여러 요소 를 제거 하면 오류가 발생할 수 있습니다.

>>> l = [0,1,2,3,4,5,6,7,8,9]
>>> indices=[3,7]
>>> for i in indices:
...     del l[i]
... 
>>> l
[0, 1, 2, 4, 5, 6, 7, 9]

원래 목록의 요소 3 및 8 (3 및 7 아님)이 제거되었지만 (루프 중에 목록이 단축되었으므로) 의도하지 않았을 수 있습니다. 여러 인덱스를 안전하게 제거하려면 대신 다음과 같이 인덱스가 가장 높은 요소를 먼저 삭제해야합니다.

>>> l = [0,1,2,3,4,5,6,7,8,9]
>>> indices=[3,7]
>>> for i in sorted(indices, reverse=True):
...     del l[i]
... 
>>> l
[0, 1, 2, 4, 5, 6, 8, 9]

4

또는 여러 인덱스를 제거해야하는 경우 :

print([v for i,v in enumerate(your_list) if i not in list_of_unwanted_indexes])

물론 다음을 수행 할 수도 있습니다.

print([v for i,v in enumerate(your_list) if i != unwanted_index])

1
인덱스 목록을 역순으로 정렬 한 다음 하나씩 삭제하지 않겠습니까? 그렇게하면 새로운 목록을 만들 필요가 없습니다.
Anthon

3

del 또는 pop을 사용하여 색인을 기반으로 목록에서 요소를 제거 할 수 있습니다. Pop은 목록에서 제거중인 멤버를 인쇄하고 list는 해당 멤버를 인쇄하지 않고 삭제합니다.

>>> a=[1,2,3,4,5]
>>> del a[1]
>>> a
[1, 3, 4, 5]
>>> a.pop(1)
 3
>>> a
[1, 4, 5]
>>> 

3

하나는 del 또는 pop을 사용할 수 있지만, 인덱스와 슬라이스를 지정할 수 있으므로 사용자가 데이터를 더 많이 제어 할 수 있으므로 del을 선호합니다.

예를 들어, 표시된 목록부터 시작 del하여 슬라이스로 마지막 요소를 제거한 다음을 사용하여 결과에서 마지막 요소를 제거 할 수 있습니다 pop.

>>> l = [1,2,3,4,5]
>>> del l[-1:]
>>> l
[1, 2, 3, 4]
>>> l.pop(-1)
4
>>> l
[1, 2, 3]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.