Hoe meerdere indexen uit een lijst te verwijderen op hetzelfde moment?

Zeg dat ik hier deze lijst heb:

list = [a, b, c, d, e, f, g]

Hoe zou ik zeggen zeg indexen 2, 3, 4, en 5op hetzelfde moment?

POP accepteert geen meerdere waarden. Hoe doe ik dit anders?


Antwoord 1, Autoriteit 100%

U moet dit in een lus doen, er is geen ingebouwde werking om een ​​aantal indexen tegelijk te verwijderen.

Uw voorbeeld is eigenlijk een aangrenzende reeks indexen, zodat u dit kunt doen:

del my_list[2:6]

die de plak verwijdert vanaf 2 en eindigt net vóór 6.

Het is niet duidelijk uit uw vraag of u in het algemeen een willekeurige verzameling van indexen wilt verwijderen, of als deze altijd een aangrenzende volgorde zal zijn.

Als u een willekeurige verzameling van indexen heeft, dan:

indexes = [2, 3, 5]
for index in sorted(indexes, reverse=True):
    del my_list[index]

Merk op dat u ze in omgekeerde volgorde wilt verwijderen, zodat u de volgende indexen niet weggooit.


Antwoord 2, Autoriteit 17%

remove_indices = [1,2,3]
somelist = [i for j, i in enumerate(somelist) if j not in remove_indices]

Voorbeeld:

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]

Antwoord 3, Autoriteit 9%

Er was niet veel hint op de prestaties voor de verschillende manieren, dus ik voerde een test uit bij het verwijderen van 5000 items van 50000 in alle 3 in het algemeen verschillende benaderingen, en voor mij was Numpy de winnaar (als je elementen hebt die in numpo hebben) :

  • 7.5 SEC voor het begrip van de lijst [4.5 SEC op een andere pc]
  • 0.08 SEC voor het verwijderen van items in omgekeerde volgorde [0.017 (!) SEC]
  • 0,009 SEC voor Numpy.Delete [0.006 SEC]

Hier is de code die ik heb getimed (in de derde functieconversie van / naar de lijst kan worden verwijderd als het rechtstreeks op Numpy-arrays werkt, ok):

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
# ...

Antwoord 4, Autoriteit 5%

Als u numpe kunt, kunt u meerdere indices verwijderen:

>>> import numpy as np
>>> a = np.arange(10)
>>> np.delete(a,(1,3,5))
array([0, 2, 4, 6, 7, 8, 9])

en als u np.r_gebruikt, kunt u plakjes combineren met individuele indices:

>>> np.delete(a,(np.r_[0:5,7,9]))
array([5, 6, 8])

De verwijdering is echter niet in place, dus u moet eraan toewijzen.


Antwoord 5, Autoriteit 4%

Als ze aangrenzend zijn, kunt u gewoon

doen

x[2:6] = []

Als u niet-beurzende indexen wilt verwijderen, is het een beetje lastiger.

x = [v for i,v in enumerate(x) if i not in frozenset((2,3,4,5))] 

Antwoord 6, Autoriteit 2%

lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
lst = lst[0:2] + lst[6:]

Dit is een bewerking in één stap. Het maakt geen gebruik van een lus en wordt daarom snel uitgevoerd. Het maakt gebruik van list slicing.


Antwoord 7

een andere optie (in plaats, elke combinatie van indices):

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

Antwoord 8

Oude vraag, maar ik heb een antwoord.

Bekijk eerst de elementen van de lijst als volgt:

for x in range(len(yourlist)):
    print '%s: %s' % (x, yourlist[x])

Noem deze functie vervolgens met een lijst van de indexenvan elementen die u wilt laten verschijnen. Het is robuust genoeg dat de volgorde van de lijst er niet toe doet.

def multipop(yourlist, itemstopop):
    result = []
    itemstopop.sort()
    itemstopop = itemstopop[::-1]
    for x in itemstopop:
        result.append(yourlist.pop(x))
    return result

Als bonus mag het resultaat alleen elementen bevatten die u wilde verwijderen.

In [73]: mijnlijst = [‘a’,’b’,’c’,’d’,’charles’]

In [76]: voor x binnen bereik(len(mylist)):

     mylist[x])

….:

0: een

1: b

2: c

3: d

4: charles

In [77]: multipop(mijnlijst, [0, 2, 4])

Uit[77]: [‘charles’, ‘c’, ‘a’]

In [78]: mijn lijst

Uit[78]: [‘b’, ‘d’]

Other episodes