Existe-t-il un moyen simple d'indexer tous les éléments d'une liste (ou d'un tableau, ou autre) à l' exception d'un index particulier? Par exemple,
mylist[3]
renverra l'article en position 3milist[~3]
renverra la liste entière sauf pour 3
Pour une liste , vous pouvez utiliser une liste comp. Par exemple, pour faire b
une copie de a
sans le 3è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 []
par ()
, b
sera un itérateur au lieu d'une liste.
Ou vous pouvez 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]
Dans numpy, vous pouvez 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])
ce qui sera, en général, beaucoup plus rapide que la compréhension de la liste ci-dessus.
>>> 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 également
numpy.concatenate
.Le moyen le plus simple que j'ai trouvé était:
cela produira votre
mylist
sans l'élément à l'indexx
.la source
Si vous utilisez numpy, le plus proche auquel je puisse penser est d'utiliser un masque
Quelque chose de similaire peut être réalisé en utilisant
itertools
sansnumpy
la source
np.arange(len(arr)) != 3
le masque, car alors il peut être incorporé, par exemplearr[~(np.arange(len(arr)) == 3)]
ou autre.Utilisez
np.delete
! Il ne supprime en fait rien en placeExemple:
la source
Je vais fournir une manière fonctionnelle (immuable) de le faire.
Le moyen standard et simple de le faire est d'utiliser le tranchage:
Production:
Utilisez la compréhension de liste:
Production:
Utilisez la fonction de filtre:
Production:
Utiliser le masquage. Le masquage est fourni par la fonction itertools.compress dans la bibliothèque standard:
Production:
Utilisez la fonction itertools.filterfalse de la bibliothèque standard Python
Production:
la source
Si vous ne connaissez pas l'index à l'avance, voici une fonction qui fonctionnera
la source
Notez que si la variable est une liste de listes, certaines approches échoueraient. Par exemple:
Pour le cas général, utilisez
la source
Si vous souhaitez supprimer le dernier ou le premier, procédez comme suit:
Si vous changez 1 en 2, les 2 premiers caractères seront supprimés et non le second. J'espère que cela aide encore!
la source