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?
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
.
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
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.
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.
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.
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.
Vous avez seulement besoin de faire myList.ajouter (40)
Il va l'ajouter à la liste d'origine, pas renvoyer une nouvelle liste.