Comment remplacer des valeurs à des index spécifiques d'une liste python?
J'ai une liste, dire
s = [5,4,3,2,1,0]
et j'ai eu 2 autres listes, dire
a = [0,1,3,5]; m = [0,0,0,0]
Ce que je veux, c'est de prendre a
'éléments que l'indice de s
puis définissez les éléments correspondants dans a
à m
c'est à dire après l'exécution, s
devrait être [0,0,3,0,1,0]
.
Apparemment, je peux le faire par le biais d'une boucle for:
for index in a:
s[a[index]] = m[index]
mais je me demande est-il d'autres façon de le faire?
ce sur l'opérateur.itemgetter ?
source d'informationauteur Alcott | 2011-08-29
Vous devez vous connecter pour publier un commentaire.
Le plus gros problème avec votre code, c'est que c'est illisible. Le code Python règle numéro un, si ce n'est pas lisible, personne ne va regarder assez longtemps pour obtenir toute information utile. Toujours utiliser descriptif, les noms de variables. Presque n'ai pas compris le bug dans votre code, nous allons le voir encore une fois avec des noms, des slow-motion replay style:
Comme cela est évident lorsque vous utilisez le descriptif, les noms de variables, vous êtes à l'indexation de la liste des index avec des valeurs de lui-même, qui n'a pas de sens dans ce cas.
Également lors de l'itération sur les 2 listes en parallèle, je tiens à utiliser le
zip
fonction (ouizip
si vous êtes inquiet au sujet de la consommation de mémoire, mais je ne suis pas un de ces itération puristes). Alors essayez plutôt ceci.Si votre problème est uniquement un problème travailler avec des listes de numéros, je dirais que @steabert a la réponse que vous recherchez avec numpy choses. Cependant, vous ne pouvez pas utiliser des séquences ou d'une autre variable de la taille des types de données comme des éléments de tableaux numpy, donc si votre variable
to_modify
a quelque chose comme ça, vous êtes probablement mieux de le faire avec une boucle for.numpy a des tableaux qui vous permettent d'utiliser d'autres listes/tableaux comme des indices:
Pourquoi ne pas simplement:
Un peu plus lent, mais lisible, je pense:
Ce sera la cause de
index
à prendre sur les valeurs de la éléments dea
afin de les utiliser comme des indices n'est pas ce que vous voulez. En Python, on itère dessus d'un récipient en fait par itération sur elle."Mais attendez", dites-vous, "Pour chacun de ces éléments de
a
j'ai besoin de travailler avec l'élément correspondant dem
. Comment suis-je censé faire sans indices?"Simple. Nous transformons
a
etm
dans une liste de paires (élément à partir d'un élément de m), et itérer sur les paires. Qui est facile à faire - il suffit d'utiliser la bibliothèque intégrée de la fonctionzip
comme suit:Pour le faire fonctionner de la façon dont vous étiez en train de le faire, vous auriez à obtenir une liste d'indices pour effectuer une itération sur. C'est faisable: on peut l'utiliser
range(len(a))
par exemple. Mais ne le faites pas! Ce n'est pas la façon dont nous faisons les choses en Python. En fait directement à l'itération sur ce que vous voulez parcourir est beau, l'esprit-idée libératrice.Pas vraiment pertinent ici. Le but de
operator.itemgetter
est de transformer l'acte de l'indexation dans quelque chose, dans une fonction-comme chose (ce que nous appelons un "callable"), de sorte qu'il peut être utilisé comme un rappel (par exemple, un élément clé de tri ou min/max des opérations). Si nous avons utilisé ici, nous devrions avoir à re-appel à chaque fois à travers la boucle pour créer un nouveau itemgetter, juste pour que nous puissions immédiatement de l'utiliser une fois et de le jeter au loin. Dans le contexte, c'est tout simplement occupé.Vous pouvez utiliser
operator.setitem
.Est-il plus lisible et efficace de votre solution? Je ne suis pas sûr!