Cómo permitir que el método list append () devuelva la nueva lista


83

Quiero hacer algo como esto:

myList = [10,20,30]
yourList = myList.append (40)

Desafortunadamente, list append no devuelve la lista modificada.

Entonces, ¿cómo puedo permitir appenddevolver la nueva lista?

Respuestas:


140

En su lugar, no use anexar sino concatenación:

yourList = myList + [40]

Esto devuelve una nueva lista; myListno se verá afectado. Si necesita haber myListafectado también , use de .append()todos modos, luego asigne por yourListseparado de (una copia de) myList.


2
¿Cuál habría sido el motivo de append()regresar en Nonelugar de la misma lista? ¿Qué principio zen violaría?
Ciprian Tomoiagă

3
@CiprianTomoiaga: consulte en.wikipedia.org/wiki/Command%E2%80%93query_separation ; list.appendes un comando, no una consulta.
Martijn Pieters

2
@CiprianTomoiaga: vea también este correo electrónico de Python BDFL .
Martijn Pieters

2
@Dieblitzen: correcto, entonces OCaml usa listas enlazadas y las conecta. Las listas de Python no son inmutables, por lo que no puede hacer eso con ellas y, además, todo lo demás puede ser mutable . Mientras que una lista OCaml contiene objetos inmutables, en Python el contenido de objetos inmutables como las tuplas aún puede ser mutable, por lo que no puede compartir el contenido con otros contenedores al concatenar.
Martijn Pieters

2
@Dieblitzen: es por eso que en Python, para que una operación de concatenación sea válida, debe crear una copia superficial y pagar el tiempo O (N). Debería haber sido más explícito, lo siento.
Martijn Pieters

21

En Python 3, puede crear una nueva lista desempaquetando la anterior y agregando un nuevo elemento:

a = [1,2,3]
b = [*a,4] # b = [1,2,3,4] 

Cuando tu lo hagas:

myList + [40]

De hecho, tienes 3 listas.


1
Y es un poco más rápido
aerobiomat

6

list.appendes una función integrada y, por lo tanto, no se puede cambiar. Pero si está dispuesto a usar algo diferente append, puede intentar +:

In [106]: myList = [10,20,30]

In [107]: yourList = myList + [40]

In [108]: print myList
[10, 20, 30]

In [109]: print yourList
[10, 20, 30, 40]

Por supuesto, la desventaja de esto es que se crea una nueva lista que lleva mucho más tiempo que append

Espero que esto ayude


Pero el incorporado se puede subclasificar y luego todo vale :)
Marcin Wyszynski

@MarcinWyszynski: sí, pero solo se pueden modificar dentro de la subclase. El método integrado de un objeto / clase integrado rara vez se puede sobrescribir, si es que alguna vez se puede sobrescribir
inspectorG4dget

3
Por su propia cordura y la de sus compañeros de trabajo, nunca debe hacer eso :)
Marcin Wyszynski

2

Puede crear una subclase del tipo de lista incorporado y redefinir el método 'agregar'. O incluso mejor, cree uno nuevo que hará lo que usted quiere que haga. A continuación se muestra el código para un método de 'agregar' redefinido.

#!/usr/bin/env python

class MyList(list):

  def append(self, element):
    return MyList(self + [element])


def main():
  l = MyList()
  l1 = l.append(1)
  l2 = l1.append(2)
  l3 = l2.append(3)
  print "Original list: %s, type %s" % (l, l.__class__.__name__)
  print "List 1: %s, type %s" % (l1, l1.__class__.__name__)
  print "List 2: %s, type %s" % (l2, l2.__class__.__name__)
  print "List 3: %s, type %s" % (l3, l3.__class__.__name__)


if __name__ == '__main__':
  main()

Espero que ayude.


2

Intente usar itertools.chain(myList, [40]). Eso devolverá un generador como una secuencia, en lugar de asignar una nueva lista. Básicamente, eso devuelve todos los elementos del primer iterable hasta que se agota, luego pasa al siguiente iterable, hasta que se agotan todos los iterables.


1

Solo para ampliar la respuesta de Storstamp

Solo necesitas hacer myList.append (40)

Lo agregará a la lista original, ahora puede devolver la variable que contiene la lista original.

Si está trabajando con listas muy grandes, este es el camino a seguir.


-4

Solo necesitas hacer myList.append (40)

Lo agregará a la lista original, no devolverá una nueva lista.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.