J'ai ceci:
>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]
>>> print a.insert(2, 3)
None
>>> print a
[1, 2, 3, 4]
>>> b = a.insert(3, 6)
>>> print b
None
>>> print a
[1, 2, 3, 6, 4]
Y a-t-il un moyen d'obtenir la liste mise à jour comme résultat, au lieu de mettre à jour la liste d'origine?
Plus court j'ai eu: b = a[:2] + [3] + a[2:]
>>>
>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]
>>> b = a[:2] + [3] + a[2:]
>>> print a
[1, 2, 4]
>>> print b
[1, 2, 3, 4]
l.insert(index, obj)
ne renvoie rien, il met simplement à jour la liste. Comme l'a dit ATO, vous pouvez faire b = a[:index] + [obj] + a[index:]
. Cependant, une autre façon est:
a = [1, 2, 4]
b = a[:]
b.insert(2, 3)
Vous pouvez également insérer l'élément à l'aide de slice indexing dans la liste. Par exemple:
>>> a = [1, 2, 4]
>>> insert_at = 2 # index at which you want to insert item
>>> b = a[:] # created copy of list "a" as "b"
# skip this step if you are ok with modifying original list
>>> b[insert_at:insert_at] = [3] # insert "3" within "b"
>>> b
[1, 2, 3, 4]
Pour insérer plusieurs éléments ensemble à un index donné , il vous suffit d'utiliser un list
de plusieurs éléments à insérer. Par exemple:
>>> a = [1, 2, 4]
>>> insert_at = 2 # index starting from which multiple elements will be inserted
# List of elements that you want to insert together at "index_at" (above) position
>>> insert_elements = [3, 5, 6]
>>> a[insert_at:insert_at] = insert_elements
>>> a # [3, 5, 6] are inserted together in `a` starting at index "2"
[1, 2, 3, 5, 6, 4]
Alternative utilisant la compréhension de liste (mais très lente en termes de performances) :
En guise d'alternative, vous pouvez le faire avec liste comprehension avec enumerate
. (Mais s'il vous plaît, ne le faites pas de cette façon. C'est juste pour illustration) :
>>> a = [1, 2, 4]
>>> insert_at = 2
>>> b = [y for i, x in enumerate(a) for y in ((3, x) if i == insert_at else (x, ))]
>>> b
[1, 2, 3, 4]
Voici la comparaison timeit
de toutes les réponses avec une liste de 1000 éléments pour Python 3.4.5:
Mine réponse utilisant l'insertion tranchée - Le plus rapide (3.08 usec par boucle)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
100000 loops, best of 3: 3.08 usec per loop
Réponse acceptée par ATOzTOA basée sur la fusion de listes découpées en tranches - Seconde (6,71 usec par boucle)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
100000 loops, best of 3: 6.71 usec per loop
Réponse de Rushy Panchal avec le plus grand nombre de votes utilisant list.insert(...)
- Third (26,5 usec par boucle)
python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
10000 loops, best of 3: 26.5 usec per loop
Mine réponse avec Compréhension de liste et enumerate
- Quatrième (très lent avec 168 usec par boucle)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]"
10000 loops, best of 3: 168 usec per loop