web-dev-qa-db-fra.com

Indexer tous * sauf * un élément en python

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

  • mylist[3] retournera l'article en position 3

  • milist[~3] renverra la liste complète sauf 3

67
choldgraf

Pour un list , vous pouvez utiliser une liste comp. Par exemple, pour faire de 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])

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

65
tom10
>>> 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

Expliquer la notation de tranche de Python

41
Andreas Jung

Le moyen le plus simple que j'ai trouvé était:

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

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

28
Andre Soares

Si vous utilisez numpy, le plus proche, je peux penser utilise 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])

Quelque chose de similaire peut être obtenu 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]
22
Abhijit

Utilisez np.delete! Il ne supprime rien réellement en place

Exemple:

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]])
1
brnl

Si vous ne connaissez pas l’index auparavant, voici une fonction qui fonctionnera

def reverse_index(l, index):
    try:
        l.pop(index)
        return l
    except IndexError:
        return False
0
aberger

Les réponses ci-dessus ne considèrent pas une exclusion basée sur 0;

def exclude(lst, i):
    if i == 0:
        return lst[i+1:]

    return lst[:i] + lst[i+1:]
0
Ian