programing

목록에서 여러 인덱스를 동시에 제거하려면 어떻게 해야 합니까?

megabox 2023. 4. 14. 21:34
반응형

목록에서 여러 인덱스를 동시에 제거하려면 어떻게 해야 합니까?

예를 들어 다음과 같은 목록이 있습니다.

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

반응형