목록에서 여러 인덱스를 동시에 제거하려면 어떻게 해야 합니까?
예를 들어 다음과 같은 목록이 있습니다.
list = [a, b, c, d, e, f, g]
인덱스를 삭제하려면 어떻게 해야 합니까?2, 3, 4
,그리고.5
동시에?
pop에는 여러 값을 사용할 수 없습니다.아니면 어떻게 하죠?
이 작업은 루프에서 수행해야 합니다. 한 번에 여러 인덱스를 제거하는 기본 제공 작업은 없습니다.
이 예는 실제로 연속된 인덱스의 시퀀스이므로 다음과 같은 작업을 수행할 수 있습니다.
del my_list[2:6]
2에서 시작하여 6시 직전에 끝나는 슬라이스를 제거합니다.
일반적으로 임의의 인덱스 컬렉션을 제거해야 하는지, 아니면 항상 연속된 시퀀스로 해야 하는지 명확하지 않습니다.
인덱스의 임의 컬렉션이 있는 경우:
indexes = [2, 3, 5]
for index in sorted(indexes, reverse=True):
del my_list[index]
후속 인덱스가 삭제되지 않도록 역순으로 삭제해야 합니다.
remove_indices = [1,2,3]
somelist = [i for j, i in enumerate(somelist) if j not in remove_indices]
예:
In [9]: remove_indices = [1,2,3]
In [10]: somelist = range(10)
In [11]: somelist = [i for j, i in enumerate(somelist) if j not in remove_indices]
In [12]: somelist
Out[12]: [0, 4, 5, 6, 7, 8, 9]
다양한 방법으로 퍼포먼스에 대한 힌트가 별로 없었기 때문에 일반적으로 3가지 접근방식으로 50000에서 5000개의 아이템을 삭제하는 테스트를 실시했습니다.나에게는 numpy가 1등입니다(numpy에 맞는 요소가 있는 경우).
- 목록 이해에 대해 7.5초 [다른 PC에서는 4.5초]
- 아이템을 역순으로 삭제하기 위한 0.08초 [0.017(!초)]
- numpy.delete의 경우 0.009초 [0.006초]
다음은 타이밍을 맞춘 코드입니다(numpy 어레이에서 직접 작업해도 문제가 없는 경우 세 번째 함수 변환 시작/종료 목록에서 삭제될 수 있습니다).
import time
import numpy as np
import random
def del_list_indexes(l, id_to_del):
somelist = [i for j, i in enumerate(l) if j not in id_to_del]
return somelist
def del_list_inplace(l, id_to_del):
for i in sorted(id_to_del, reverse=True):
del(l[i])
def del_list_numpy(l, id_to_del):
arr = np.array(l, dtype='int32')
return list(np.delete(arr, id_to_del))
l = range(50000)
random.shuffle(l)
remove_id = random.sample(range(len(l)), 5000) # 10% ==> 5000
# ...
만약 그것들이 인접해 있다면, 당신은 그냥 할 수 있습니다.
x[2:6] = []
연속되지 않은 인덱스를 제거하려면 조금 더 까다롭습니다.
x = [v for i,v in enumerate(x) if i not in frozenset((2,3,4,5))]
numpy를 사용할 수 있는 경우 여러 인덱스를 삭제할 수 있습니다.
>>> import numpy as np
>>> a = np.arange(10)
>>> np.delete(a,(1,3,5))
array([0, 2, 4, 6, 7, 8, 9])
그리고 만약 당신이np.r_
슬라이스를 개별 인덱스와 결합할 수 있습니다.
>>> np.delete(a,(np.r_[0:5,7,9]))
array([5, 6, 8])
단, 삭제는 그렇지 않습니다.in place
할당해야 합니다.
lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
lst = lst[0:2] + lst[6:]
이것은 1단계 조작입니다.루프를 사용하지 않기 때문에 빠르게 실행됩니다.리스트 슬라이스를 사용합니다.
다른 옵션(적용된 모든 지수 조합):
_marker = object()
for i in indices:
my_list[i] = _marker # marked for deletion
obj[:] = [v for v in my_list if v is not _marker]
오래된 질문이지만 답이 있어요.
먼저 다음과 같이 목록의 요소를 검토합니다.
for x in range(len(yourlist)):
print '%s: %s' % (x, yourlist[x])
그런 다음 팝할 요소의 인덱스 목록을 사용하여 이 함수를 호출합니다.리스트의 순서는 중요하지 않을 정도로 견고합니다.
def multipop(yourlist, itemstopop):
result = []
itemstopop.sort()
itemstopop = itemstopop[::-1]
for x in itemstopop:
result.append(yourlist.pop(x))
return result
보너스로 결과에는 제거할 요소만 포함되어 있어야 합니다.
[73]에서: mylist = ['a' 'b' 'c' 'd' 'd' 'mylist']
[76]: x가 범위(len(mylist)인 경우:
mylist[x])
....:
0: a
1: b
2: c
3: d
4: 찰스
...
입력 [77]: multiop (mylist, [0, 2, 4])
Out [ 77 ] : [ charles , c , a ]
...
[78] 입력: my list
출력[78]:['b', 'd']
언급URL : https://stackoverflow.com/questions/11303225/how-to-remove-multiple-indexes-from-a-list-at-the-same-time
'programing' 카테고리의 다른 글
현재 아이폰/디바이스 모델을 판별하는 방법 (0) | 2023.04.14 |
---|---|
SQL 네트워크 인터페이스, 오류: 50 - 로컬 데이터베이스 런타임 오류가 발생했습니다.자동 인스턴스를 만들 수 없습니다. (0) | 2023.04.14 |
Bash 함수에서 부울 반환 (0) | 2023.04.14 |
속성을 포함하는 Objective-C 프로토콜을 어떻게 처리합니까? (0) | 2023.04.14 |
Swift 컴파일러 오류: 문자열 연결 시 "표현이 너무 복잡함" (0) | 2023.04.14 |