Comme d'autres mentionnés, pop et del sont les moyens efficaces de supprimer un élément d'index donné. Pourtant, juste pour le plaisir de terminer (puisque la même chose peut être faite de plusieurs façons en Python):
Utilisation de tranches (cela ne supprime pas en place l'élément de la liste d'origine):
(Ce sera également la méthode la moins efficace lorsque vous travaillerez avec une liste Python, mais cela pourrait être utile (mais pas efficace, je le répète) lorsque vous travaillez avec des objets définis par l'utilisateur qui ne prennent pas en charge la pop, mais définissez néanmoins a __getitem__
):
>>> a = [1, 2, 3, 4, 5, 6]
>>> index = 3 # Only positive index
>>> a = a[:index] + a[index+1 :]
# a is now [1, 2, 3, 5, 6]
Remarque: Veuillez noter que cette méthode ne modifie pas la liste en place comme pop
et del
. Il crée à la place deux copies de listes (une depuis le début jusqu'à l'index mais sans lui ( a[:index]
) et une après l'index jusqu'au dernier élément ( a[index+1:]
)) et crée un nouvel objet liste en ajoutant les deux. Il est ensuite réaffecté à la variable de liste ( a
). L'ancien objet liste est donc déréférencé et donc récupéré (à condition que l'objet liste d'origine ne soit référencé par aucune variable autre que a).
Cela rend cette méthode très inefficace et peut également produire des effets secondaires indésirables (en particulier lorsque d'autres variables pointent vers l'objet de liste d'origine qui reste non modifié).
Merci à @MarkDickinson de l'avoir signalé ...
Cette réponse Stack Overflow explique le concept de découpage.
Notez également que cela ne fonctionne qu'avec des indices positifs.
Lors de l'utilisation avec des objets, la __getitem__
méthode doit avoir été définie et, plus important encore, la __add__
méthode doit avoir été définie pour renvoyer un objet contenant des éléments des deux opérandes.
En substance, cela fonctionne avec tout objet dont la définition de classe est comme:
class foo(object):
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return foo(self.items[index])
def __add__(self, right):
return foo( self.items + right.items )
Cela fonctionne avec list
qui définit __getitem__
et les __add__
méthodes.
Comparaison des trois voies en termes d'efficacité:
Supposons que ce qui suit est prédéfini:
a = range(10)
index = 3
La del object[index]
méthode:
De loin la méthode la plus efficace. Il fonctionne avec tous les objets qui définissent une __del__
méthode.
Le démontage est le suivant:
Code:
def del_method():
global a
global index
del a[index]
Démontage:
10 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 DELETE_SUBSCR # This is the line that deletes the item
7 LOAD_CONST 0 (None)
10 RETURN_VALUE
None
pop
méthode:
Elle est moins efficace que la méthode del et est utilisée lorsque vous avez besoin d'obtenir l'élément supprimé.
Code:
def pop_method():
global a
global index
a.pop(index)
Démontage:
17 0 LOAD_GLOBAL 0 (a)
3 LOAD_ATTR 1 (pop)
6 LOAD_GLOBAL 2 (index)
9 CALL_FUNCTION 1
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
La méthode tranche et ajout.
Le moins efficace.
Code:
def slice_method():
global a
global index
a = a[:index] + a[index+1:]
Démontage:
24 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 SLICE+2
7 LOAD_GLOBAL 0 (a)
10 LOAD_GLOBAL 1 (index)
13 LOAD_CONST 1 (1)
16 BINARY_ADD
17 SLICE+1
18 BINARY_ADD
19 STORE_GLOBAL 0 (a)
22 LOAD_CONST 0 (None)
25 RETURN_VALUE
None
Remarque: Dans les trois démontages, ignorez les deux dernières lignes qui le sont essentiellement return None
. Les deux premières lignes chargent également les valeurs globales a
et index
.
O(n)
en fonctionnement temporel.deque()
fournit des opérations efficaces aux deux extrémités mais ne fournit pas d'insertions / recherches / suppressions O (1) au milieu.