Ne pas utiliser ajouter mais au lieu de concaténation:
yourList = myList +[40]
Cela renvoie une nouveau liste; myList ne seront pas affectés. Si vous avez besoin d'avoir myList touchés ainsi utiliser .append() de toute façon, alors affecter yourList séparément (une copie de) myList.
ce qui aurait été la justification de l' append() retour None au lieu de le même liste ? Qui zen principe serait-il violent ?
Le problème avec l'aide de + pour concaténer qu'un élément est, il est O(n) dans le temps de la complexité. Est-il un équivalent de l'opérateur Cons (comme dans certains langages fonctionnels) qui est juste en O(1), mais retourne la nouvelle liste ainsi?
vous ne pouvez pas avoir un O(1) opération de copie de données de taille de la structure. Donc non, il n'y a pas d'équivalent, cons opérateurs de toujours prendre en O(n) fois.
Les inconvénients de l'opérateur n'est pas en O(n) (au moins en OCaml), car la liste est immuable. J'ai lié une ressource ci-dessous. Je me demande si il est possible en python pour utiliser un opérateur similaire à l'opérateur cons dans les fonctionnalités, mais je ne crois pas, depuis le python listes sont mutables. cs.cornell.edu/courses/cs3110/2018fa/textbook/data/...
bon, alors OCaml utilise les listes chaînées et relie ces. Python, les listes ne sont pas immuables de sorte que vous ne pouvez pas le faire avec ceux-ci, et de plus, tout le reste peut être mutable. Alors qu'un OCaml liste contient des objets immuables, en Python le contenu des objets immuables comme les tuples peuvent encore être mutable, de sorte que vous ne pouvez pas partager le contenu avec d'autres conteneurs lors de la concaténation.
c'est pourquoi en Python, pour une opération de concaténation pour être valide, vous devez créer une copie superficielle, et de payer le O(N) fois. J'aurais dû être plus explicite, désolé.
list.append est intégré et, par conséquent, ne peut pas être modifié. Mais si vous êtes prêt à utiliser autre chose que append, vous pouvez essayer de +:
Vous pouvez sous-classe de la liste intégrée de type et de redéfinir la 'append' méthode. Ou mieux encore, de créer une nouvelle qui va faire ce que vous voulez qu'il fasse. Ci-dessous est le code pour une nouvelle définition de l' 'append' méthode.
#!/usr/bin/env pythonclassMyList(list):def append(self, element):returnMyList(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()
Essayez d'utiliser itertools.chain(myList, [40]). Qui sera de retour d'un générateur de séquence, plutôt que d'allouer une nouvelle liste. Essentiellement, qui renvoie tous les éléments de la première itératif jusqu'à ce qu'il est épuisé, puis passe à la suivante itératif, jusqu'à ce que tous les iterables sont épuisées.
Ne pas utiliser ajouter mais au lieu de concaténation:
Cela renvoie une nouveau liste;
myList
ne seront pas affectés. Si vous avez besoin d'avoirmyList
touchés ainsi utiliser.append()
de toute façon, alors affecteryourList
séparément (une copie de)myList
.append()
retourNone
au lieu de le même liste ? Qui zen principe serait-il violent ?list.append
est un ordre, pas une requête.cons
opérateurs de toujours prendre en O(n) fois.En python 3, vous pouvez créer une nouvelle liste par le déballage vieux l'un et l'ajout d'un nouvel élément:
lorsque vous faites:
En fait, vous avez 3 listes.
list.append
est intégré et, par conséquent, ne peut pas être modifié. Mais si vous êtes prêt à utiliser autre chose queappend
, vous pouvez essayer de+
:Bien sûr, l'inconvénient est que une nouvelle liste est créée, qui prend beaucoup plus de temps que
append
Espère que cette aide
Vous pouvez sous-classe de la liste intégrée de type et de redéfinir la 'append' méthode. Ou mieux encore, de créer une nouvelle qui va faire ce que vous voulez qu'il fasse. Ci-dessous est le code pour une nouvelle définition de l' 'append' méthode.
Espère que ça aide.
Essayez d'utiliser
itertools.chain(myList, [40])
. Qui sera de retour d'un générateur de séquence, plutôt que d'allouer une nouvelle liste. Essentiellement, qui renvoie tous les éléments de la première itératif jusqu'à ce qu'il est épuisé, puis passe à la suivante itératif, jusqu'à ce que tous les iterables sont épuisées.Juste pour élargir sur Storstamp la réponse de
Vous avez seulement besoin de le faire
myList.append(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 le faire
myList.append(40)
Il va ajouter à la liste d'origine, pas de retour une nouvelle liste.