Python에서 인덱스별로 목록에서 요소를 제거하려면 어떻게 해야 합니까?
list.remove
메소드를 찾았지만 마지막 요소를 제거하고 싶습니다. 어떻게 해야 하나요? 기본 제거가 목록을 검색하는 것처럼 보이지만 검색을 수행하고 싶지 않습니다.
질문자 :Joan Venge
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]
참고: pop
및 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 )
__getitem__
및 __add__
메소드를 정의 list
과 함께 작동합니다.
효율성 측면에서 세 가지 방법 비교:
다음이 미리 정의되어 있다고 가정합니다.
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]
두 번째 요소를 삭제한 후 실제로 삭제하는 세 번째 요소는 원래 목록의 네 번째 요소이기 때문입니다. 원래 목록에서 두 번째, 세 번째 및 일곱 번째 요소를 필터링하고 아래와 같이 새 목록을 얻을 수 있습니다.
new list = [j for i, j in enumerate(my_list) if i not in [2, 3, 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]
이것은 수행하려는 작업에 따라 다릅니다.
제거한 요소를 반환하려면 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]
인덱스로 목록에서 요소를 제거하는 또 다른 방법입니다.
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] 는 인덱스 x
에서 y-1
까지의 요소를 가리킵니다. 목록의 해당 부분을 빈 목록( []
)으로 선언하면 해당 요소가 제거됩니다.
del
문을 사용합니다.
del listName[-N]
예를 들어 마지막 3개 항목을 제거하려면 코드가 다음과 같아야 합니다.
del listName[-3:]
예를 들어, 마지막 8개 항목을 제거하려면 코드는 다음과 같아야 합니다.
del listName[-8:]
삭제하려는 항목을 검색하면 됩니다. 정말 간단합니다. 예시:
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)
출력: 에이드
다음 코드를 사용하여 목록에서 요소를 제거합니다.
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]
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]
앞서 언급했듯이 모범 사례는 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: 흠... 음수 인덱스 값에서는 작동하지 않습니다. 숙고하고 업데이트할 것입니다.
내 생각에
if index_<0:index_=len(list_)+index_
패치를 하겠지만... 갑자기 이 아이디어가 매우 부서지기 쉬운 것 같습니다. 그래도 흥미로운 사고 실험. append() / list comprehension을 사용하여 이를 수행하는 '적절한' 방법이 있어야 하는 것 같습니다.
숙고
목록 목록으로 작업하는 것 같지 않으므로 이만 짧게 하겠습니다. 목록인 요소가 아닌 요소를 제거하기 때문에 pop을 사용하고 싶으므로 del을 사용해야 합니다. 파이썬에서 마지막 요소를 호출하려면 "-1"입니다.
>>> test = ['item1', 'item2'] >>> test.pop(-1) 'item2' >>> test ['item1']
또는 여러 인덱스를 제거해야 하는 경우:
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])
del 또는 pop을 사용하여 인덱스를 기반으로 목록에서 요소를 제거할 수 있습니다. Pop은 목록에서 제거 중인 구성원을 인쇄하고 목록은 인쇄하지 않고 해당 구성원을 삭제합니다.
>>> a=[1,2,3,4,5] >>> del a[1] >>> a [1, 3, 4, 5] >>> a.pop(1) 3 >>> a [1, 4, 5] >>>
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]
출처 : http:www.stackoverflow.com/questions/627435/how-to-remove-an-element-from-a-list-by-index
C++에서 int를 문자열로 변환하는 가장 쉬운 방법 (0) | 2021.12.31 |
---|---|
Git 병합 대신 Git 리베이스를 언제 사용합니까? (0) | 2021.12.31 |
Python의 정적 메서드? (0) | 2021.12.31 |
꼬리 재귀 란 무엇입니까? (0) | 2021.12.31 |
SQL Server의 LEFT JOIN 대 LEFT OUTER JOIN (0) | 2021.12.31 |