list.append()
es la opción obvia para agregar al final de una lista. Aquí hay una explicación razonable para los desaparecidos list.prepend()
. Asumiendo que mi lista es corta y las preocupaciones de rendimiento son insignificantes, es
list.insert(0, x)
o
list[0:0] = [x]
¿idiomático?
Si puede seguir el camino funcional, lo siguiente es bastante claro
Por supuesto no se ha insertado
x
enyour_list
, en lugar de haber creado una nueva lista conx
preprended a ella.fuente
Por lo general, no desea anteponer repetidamente a una lista en Python.
Si es corto , y no lo estás haciendo mucho ... entonces está bien.
list.insert
El
list.insert
puede ser usado de esta manera.Pero esto es ineficiente, porque en Python, a
list
es una matriz de punteros, y Python ahora debe tomar cada puntero en la lista y moverlo hacia abajo para insertar el puntero en su objeto en la primera ranura, por lo que esto es realmente eficiente para listas más bien cortas, como preguntas.Aquí hay un fragmento de la fuente CPython donde se implementa esto, y como puede ver, comenzamos al final de la matriz y movemos todo hacia abajo por uno para cada inserción:
Si desea un contenedor / lista que sea eficiente para anteponer elementos, desea una lista vinculada. Python tiene una lista doblemente vinculada, que se puede insertar al principio y al final rápidamente, se llama a
deque
.deque.appendleft
A
collections.deque
tiene muchos de los métodos de una lista.list.sort
es una excepción, por lo quedeque
definitivamente no es completamente sustituible por Liskovlist
.El
deque
también tiene unappendleft
método (así comopopleft
). Eldeque
es una cola de doble extremo y una lista doblemente enlazada: no importa la longitud, siempre lleva la misma cantidad de tiempo pretender algo. En la notación O grande, O (1) versus el tiempo O (n) para las listas. Aquí está el uso:deque.extendleft
También es relevante el
extendleft
método de deque , que antecede iterativamente:Tenga en cuenta que cada elemento se antepondrá uno a la vez, invirtiendo efectivamente su orden.
Rendimiento de
list
versusdeque
Primero configuramos con algunos pretendientes iterativos:
y rendimiento:
El deque es mucho más rápido. A medida que las listas se alarguen, esperaría que una deque funcione aún mejor. Si puede usar deque
extendleft
probablemente obtendrá el mejor rendimiento de esa manera.fuente
Si alguien encuentra esta pregunta como yo, aquí están mis pruebas de rendimiento de los métodos propuestos:
Como puede ver, la
insert
asignación de divisiones es casi el doble de rápida que la suma explícita y los resultados son muy parecidos. Como Raymond Hettinger señalóinsert
es una opción más común y yo personalmente prefiero esta forma de anteponer a la lista.fuente
.insert
y[0:0] = [0]
funcionan en el lugar , todavía tienen que reasignar todo el búfer.