python - txt - ¿Cuál es la mejor manera de copiar una lista?
eliminar una linea de un archivo en python (7)
Esta pregunta ya tiene una respuesta aquí:
- Cómo clonar o copiar una lista? 18 respuestas
¿Cuál es la mejor manera de copiar una lista? Sé de las siguientes maneras, ¿cuál es mejor? ¿O hay otra manera?
lst = [''one'', 2, 3]
lst1 = list(lst)
lst2 = lst[:]
import copy
lst3 = copy.copy(lst)
A menudo uso:
lst2 = lst1 * 1
Si lst1 contiene otros contenedores (como otras listas), debe usar deepcopy desde copy lib como se muestra en Mark.
ACTUALIZACIÓN: Explicando la profundidad
>>> a = range(5)
>>> b = a*1
>>> a,b
([0, 1, 2, 3, 4], [0, 1, 2, 3, 4])
>>> a[2] = 55
>>> a,b
([0, 1, 55, 3, 4], [0, 1, 2, 3, 4])
Como puede ver solo un cambio ... Lo intentaré ahora con una lista de listas
>>>
>>> a = [range(i,i+3) for i in range(3)]
>>> a
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>> b = a*1
>>> a,b
([[0, 1, 2], [1, 2, 3], [2, 3, 4]], [[0, 1, 2], [1, 2, 3], [2, 3, 4]])
No tan legible, déjame imprimirlo con a para:
>>> for i in (a,b): print i
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>> a[1].append(''appended'')
>>> for i in (a,b): print i
[[0, 1, 2], [1, 2, 3, ''appended''], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3, ''appended''], [2, 3, 4]]
¿Ves eso? Se adjuntó a la b [1] también, por lo que b [1] y a [1] son el mismo objeto. Ahora pruébalo con deepcopy
>>> from copy import deepcopy
>>> b = deepcopy(a)
>>> a[0].append(''again...'')
>>> for i in (a,b): print i
[[0, 1, 2, ''again...''], [1, 2, 3, ''appended''], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3, ''appended''], [2, 3, 4]]
En términos de rendimiento, hay una sobrecarga en la list()
llamadas list()
comparación con el corte. Entonces, para listas cortas, lst2 = lst1[:]
es aproximadamente dos veces más rápido que lst2 = list(lst1)
.
En la mayoría de los casos, esto probablemente se ve superado por el hecho de que list()
es más legible, pero en loops ajustados puede ser una optimización valiosa.
Las listas cortas, [:] son las mejores:
In [1]: l = range(10)
In [2]: %timeit list(l)
1000000 loops, best of 3: 477 ns per loop
In [3]: %timeit l[:]
1000000 loops, best of 3: 236 ns per loop
In [6]: %timeit copy(l)
1000000 loops, best of 3: 1.43 us per loop
Para listas más grandes, todas son iguales:
In [7]: l = range(50000)
In [8]: %timeit list(l)
1000 loops, best of 3: 261 us per loop
In [9]: %timeit l[:]
1000 loops, best of 3: 261 us per loop
In [10]: %timeit copy(l)
1000 loops, best of 3: 248 us per loop
Para listas muy grandes (probé 50MM), todavía son más o menos lo mismo.
Me gusta hacer:
lst2 = list(lst1)
La ventaja sobre lst1 [:] es que la misma expresión funciona para dicts:
dct2 = dict(dct1)
Si desea una copia superficial (los elementos no se copian), use:
lst2=lst1[:]
Si desea hacer una copia profunda, utilice el módulo de copia:
import copy
lst2=copy.deepcopy(lst1)
También puedes hacer esto:
import copy
list2 = copy.copy(list1)
Esto debería hacer lo mismo que la copia superficial de Mark Roddy.
También puedes hacer:
a = [1, 2, 3]
b = list(a)