web-dev-qa-db-fra.com

Autoriser la méthode d’ajout de liste Python à renvoyer la nouvelle liste

Je veux faire quelque chose comme ça:

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

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

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

37
Wilk

N'utilisez pas append mais plutôt la concaténation:

yourList = myList + [40]

Ceci retourne un nouveau liste; myList ne sera pas affecté. Si vous devez affecter myList de même soit utiliser .append() de toute façon, affectez yourList séparément de (copie de) myList.

76
Martijn Pieters

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

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

quand tu fais:

myList + [40]

Vous avez en fait 3 listes.

7

list.append est intégré et ne peut donc pas être modifié. 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 qu’une nouvelle liste est créée, ce qui prend beaucoup plus de temps que append

J'espère que cela t'aides

6
inspectorG4dget

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. 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 __== '__main__':
  main()

J'espère que cela pourra aider.

2
Marcin Wyszynski

Juste pour développer la réponse de Storstamp

Il vous suffit de faire MyList.append (40)

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

Si vous travaillez avec de très grandes listes, c'est la voie à suivre.

0
ajayinvictus10

Essayez d'utiliser itertools.chain(myList, [40]). Cela retournera un générateur sous forme de séquence, plutôt que d'allouer une nouvelle liste. Essentiellement, tous les éléments de la première itérative sont renvoyés jusqu'à épuisement, puis sont passés à la suivante, jusqu'à ce que tous les itérables soient épuisés.

0
jsears