191 votes

Indexer tous les éléments *à l'exception* d'un seul en python

Existe-t-il un moyen simple d'indexer tous les éléments d'une liste (ou d'un tableau, ou autre) ? sauf pour un indice particulier ? Par exemple,

  • mylist[3] renvoie l'élément en position 3

  • milist[~3] renvoie toute la liste à l'exception de 3

183voto

tom10 Points 19886

Pour un liste Vous pourriez utiliser un compilateur de listes. Par exemple, pour faire b une copie de a sans le troisième élément :

a = range(10)[::-1]                       # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
b = [x for i,x in enumerate(a) if i!=3]   # [9, 8, 7, 5, 4, 3, 2, 1, 0]

Ceci est très général, et peut être utilisé avec tous les itérables, y compris les tableaux numpy. Si vous remplacez [] con () , b sera un itérateur au lieu d'une liste.

Vous pouvez aussi le faire sur place avec pop :

a = range(10)[::-1]     # a = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
a.pop(3)                # a = [9, 8, 7, 5, 4, 3, 2, 1, 0]

En numpy vous pourriez le faire avec une indexation booléenne :

a = np.arange(9, -1, -1)     # a = array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
b = a[np.arange(len(a))!=3]  # b = array([9, 8, 7, 5, 4, 3, 2, 1, 0])

qui sera, en général, beaucoup plus rapide que la compréhension de liste mentionnée ci-dessus.

102voto

André Guilherme Points 136

La méthode la plus simple que j'ai trouvée est la suivante :

mylist[:x] + mylist[x+1:]

qui produira votre mylist sans l'élément à l'index x .

Exemple

mylist = [0, 1, 2, 3, 4, 5]
x = 3
mylist[:x] + mylist[x+1:]

Résultat produit

mylist = [0, 1, 2, 4, 5]

58voto

>>> l = range(1,10)
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[:2] 
[1, 2]
>>> l[3:]
[4, 5, 6, 7, 8, 9]
>>> l[:2] + l[3:]
[1, 2, 4, 5, 6, 7, 8, 9]
>>> 

Voir aussi

Expliquer la notation en tranches de Python

32voto

Abhijit Points 24122

Si vous utilisez numpy, la solution la plus proche est l'utilisation d'un masque.

>>> import numpy as np
>>> arr = np.arange(1,10)
>>> mask = np.ones(arr.shape,dtype=bool)
>>> mask[5]=0
>>> arr[mask]
array([1, 2, 3, 4, 5, 7, 8, 9])

Il est possible d'obtenir quelque chose de similaire en utilisant itertools sans numpy

>>> from itertools import compress
>>> arr = range(1,10)
>>> mask = [1]*len(arr)
>>> mask[5]=0
>>> list(compress(arr,mask))
[1, 2, 3, 4, 5, 7, 8, 9]

17voto

brnl Points 171

Utilisation np.delete ! Il ne supprime rien sur place

Dans votre exemple, "mylist[~3]" s'écrirait ainsi : mylist.delete(3)

Un exemple plus complexe :

import numpy as np
a = np.array([[1,4],[5,7],[3,1]])                                       

# a: array([[1, 4],
#           [5, 7],
#           [3, 1]])

ind = np.array([0,1])                                                   

# ind: array([0, 1])

# a[ind]: array([[1, 4],
#                [5, 7]])

all_except_index = np.delete(a, ind, axis=0)                                              
# all_except_index: array([[3, 1]])

# a: (still the same): array([[1, 4],
#                             [5, 7],
#                             [3, 1]])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X