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

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

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



답변

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]

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


답변

당신은 아마 원할 것입니다 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']


답변

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

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

(이것은 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.


답변

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

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

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


답변

목록에서 특정 위치 요소 (예 : 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]]


답변

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

제거한 요소를 반환하려면 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:].


답변

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

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