Autoriser la méthode Python list append à renvoyer la nouvelle liste

Je veux faire quelque chose comme ceci:

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

Malheureusement, list append ne renvoie pas la liste modifiée.

Alors, comment puis-je autoriser append pour revenir à la nouvelle liste?

32
demandé sur Wilk 2012-10-15 23:52:17

7 réponses

N'utilisez pas append mais la concaténation à la place:

yourList = myList + [40]

Cela renvoie une nouvelle liste ; myList ne sera pas affectée. Si vous avez besoin d'avoir myList touchés aussi utiliser .append(), alors affecter yourList séparément (une copie de) myList.

66
répondu Martijn Pieters 2012-10-15 19:54:17

list.append est un élément et ne peut donc pas être changé. Mais si vous êtes prêt à utiliser autre chose que append, Vous pouvez essayer +:

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]

Bien sûr, l'inconvénient est que une nouvelle liste est créée, qui prend beaucoup plus de temps que append

J'espère que cela aide

6
répondu inspectorG4dget 2012-10-15 19:54:27

Dans python 3, vous pouvez créer une nouvelle liste en déballant l'ancienne et en ajoutant un nouvel élément:

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

Quand vous faites:

myList + [40]

Vous avez en fait 3 listes.

6
répondu Damian Paszkowski 2018-03-02 09:25:38

Vous pouvez sous-classer le type de liste intégré et redéfinir la méthode 'append'. Ou mieux encore, créez-en un nouveau qui fera ce que vous voulez qu'il fasse. Vous trouverez ci-dessous le code d'une méthode 'append' redéfinie.

#!/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()

J'espère que ça aide.

2
répondu Marcin Wyszynski 2012-10-15 20:04:46

Essayez d'utiliser itertools.chain(myList, [40]). Cela renverra un générateur en tant que séquence, plutôt que d'allouer une nouvelle liste. Essentiellement, cela renvoie tous les éléments du premier itérable jusqu'à ce qu'il soit épuisé, puis passe à l'itérable suivant, jusqu'à ce que tous les itérables soient épuisés.

0
répondu jsears 2015-06-26 18:38:55

Juste pour développer la réponse de Storstamp

Vous avez seulement besoin de faire myList.ajouter (40)

, Il va ajouter à la liste d'origine,maintenant vous pouvez retourner la variable contenant la liste d'origine.

Si vous travaillez avec de très grandes listes c'est le chemin à parcourir.

0
répondu ajayinvictus10 2017-04-02 18:00:01

Vous avez seulement besoin de faire myList.ajouter (40)

Il va l'ajouter à la liste d'origine, pas renvoyer une nouvelle liste.

-1
répondu Storstamp 2012-10-15 19:54:45