Ajout de l'élément de listes dans une compréhension de liste
J'ai une liste, disons, a = [[1,2],[3,4],[5,6]]
Je veux ajouter la chaîne 'a'
de chaque élément dans la liste a
.
Lorsque j'utilise:
a = [x.append('a') for x in a]
il retourne [None,None,None]
.
Mais si j'utilise:
a1 = [x.append('a') for x in a]
puis il fait quelque chose de bizarre.
a
, mais pas a1
est [[1,2,'a'],[3,4,'a'],[5,6,'a']]
.
Je ne comprends pas pourquoi le premier appel renvoie [None, None, None]
ni pourquoi la seconde changements sur a
au lieu de a1
.
OriginalL'auteur ariel | 2010-03-24
Vous devez vous connecter pour publier un commentaire.
list.append
mutation de la liste elle-même et renvoieNone
. Interprétations de la liste sont pour stocker le résultat, ce qui n'est pas ce que vous voulez dans ce cas, si vous voulez juste changer les listes initiales.OriginalL'auteur Mike Graham
Comme d'autres l'ont dit,
append
mutation de la liste elle-même, et vous ne devriez pas l'affecter à une variable. L'exécution des modifications de ses données, de manière efficace la mise à jour de tout le monde le pointe du doigt.Mais, il y a un truc que j'utilise quand je veux faire des trucs dans une fonctionnelle* en route alors que la mutation des objets existants (plutôt que d'en construire de nouveaux, dans ce cas, l'
a=[x + ['a'] for x in a]
, ou plus précisément lax + ['a']
).Donc, si vous êtes assez courageux, vous pouvez aussi le faire:
Cela fonctionne parce que
append
retourneNone
, et laor
continue sur pour effectuer une recherche de la vérité-valeur de y, quix
est (c'est unlist
avec au moins ce qui a été ajouté).Pourquoi ai-je besoin?
Dire que vous avez une liste et que vous souhaitez insérer certains de ses membres à une nouvelle liste, et de mettre à jour les références en conséquence:
De sorte que vous disposez de la liste
all
:Certains de il est inséré et mis à jour à une nouvelle liste
x
:Certains de
all
est également inséré et mis à jour pour la listey
:all
est mis à jour:Mais
x
est également mis à jour:Et
y
est généré comme prévu:Dans l'ensemble, pour les tâches simples, je vous recommande d'utiliser un
for
de la boucle de mise à jour de manière explicite. C'est ce qui est considéré comme pythonic.Techniquement parlant, si vous aviez accès à la liste de la classe, vous pouvez faire de cette fonction:
append
n'est pas très pratique puisqu'il se transforme une liste (pure programmation fonctionnelle a seulement des objets immuables) et ne renvoie pas une raison pour passer à d'autres actions (fonctions). En utilisant les concepts de la programmation fonctionnelle, vous pouvez créer de superbes gros one-liners que personne ne peut lire, aussi connu comme la "sécurité de l'emploi" ou de "mauvais code".Je suis curieux de connaître votre point de nouvelles perspectives.
mes idées nouvelles sont que, sans l'immuabilité de son tout simplement trop complexe. La valeur par défaut doit être immuable (et python a certaines solutions comme
frozenset
ettuple
) - mais son vraiment manque de ne pas avoir unfrozendict
et n'ayant pas l'immuable versions en tant que par défaut. Je n'aime pas vraiment cette réponse depuis son très étrange, pour python.OriginalL'auteur Reut Sharabani
Pour le premier cas, la raison pour laquelle il renvoie
[None, None, None]
est parce que lelist.append
fonction renvoieNone
, et c'est ce qu'il stocke dans la liste.Dans le second cas, c'est parce que la liste est mutable, et à chaque fois que vous ajoutez de la valeur, de la liste d'origine est modifié.
Ce que vous avez besoin est un non-lieu ajout de l'opérateur, tels que
+
. c'est à dire[x + ['a'] for x in a]
.OriginalL'auteur sykora
(C'est une combinaison de réponses par Mike Graham et sykora):
Si vous souhaitez simplement modifier les valeurs en place, essayez un régulier pour une boucle, et pas une compréhension de liste:
Si vous voulez laisser un seul, et mettre le résultat dans la plage a1:
Comme ils ont expliqué,
append
modifie la liste, mais ne renvoie Aucun, alors que+
laisse la seule liste, mais retourne une nouvelle liste ci-jointe.Oups. Fixe. Merci.
OriginalL'auteur Oddthinking
Vous pouvez utiliser la liste de plus à l'intérieur d'une compréhension de liste, comme suit:
Ce qui donne le résultat souhaité pour un. On pourrait le rendre plus efficace dans ce cas par l'affectation de ['a'] à un nom de variable avant la boucle, mais cela dépend de ce que vous voulez faire.
OriginalL'auteur Bud
quitter le
a =
et sur le côté effet sura
:map
utilisation a été mal vu. Explicite est mieux que implicites; utiliser une boucle plutôt que d'une compréhension de liste.OriginalL'auteur Ruggero Turra
Dans la première affectation de la valeur de votre compréhension de liste un Attribut d'Erreur, 'NoneType' object n'a pas d'attribut 'append', permet d'expliquer pourquoi votre liste, un, sera chargé avec Aucune(s). Pour obtenir ma console pour lancer l'erreur, j'ai utilisé x comme une variable de la liste de compréhension et aussi de l'itérateur.
Ensuite, j'ai repris l'un de x et il a jeté la même erreur.
OriginalL'auteur Rider