Python: évolution de la valeur dans un tuple
Je suis nouveau sur python, donc cette question est peut-être un peu de base. J'ai un n-uplet appelé values
qui contient les éléments suivants:
('275', '54000', '0.0', '5000.0', '0.0')
Je veux changer la première valeur (c'est à dire, 275
) dans ce tuple, mais je comprends que les tuples sont immuables donc values[0] = 200
ne fonctionnera pas. Comment puis-je y parvenir?
- les tuples sont immuables, vous devez créer un nouveau tuple dans le but d'atteindre cet objectif.
Vous devez vous connecter pour publier un commentaire.
Vous devez d'abord demander, pourquoi vous voulez faire ça?
Mais il est possible via:
Mais si vous allez avoir besoin de changer les choses, vous êtes probablement mieux de le garder comme un
list
namedtuple
, vous pouvez utiliser le_replace()
méthode.En fonction de votre problème de découpage peut être une solution élégante:
Cela vous permet d'ajouter de multiples éléments ou de remplacer aussi quelques éléments (surtout si elles sont "voisins". Dans le cas ci-dessus de la coulée à une liste est probablement plus approprié et plus lisible (même si le découpage de la notation est beaucoup plus courte).
Bien, comme Trufa a déjà montré, il y a essentiellement deux façons de remplacer un n-uplet de l'élément à un index donné. Soit convertir le tuple à une liste, remplacer l'élément et de les convertir en arrière, ou la construction d'un nouveau tuple par concaténation.
Alors, quelle méthode est la meilleure, c'est plus rapide?
Il s'avère que pour le court n-uplets (sur Python 3.3), la concaténation est effectivement plus rapide!
Pourtant, si nous regardons de plus de tuples de la liste de conversion est le chemin à parcourir:
Pour très longtemps tuples, liste de conversion est nettement mieux!
Aussi, les performances de la méthode de concaténation dépend de l'indice à partir duquel nous remplacer l'élément. Pour la méthode de la liste, l'index est hors de propos.
Donc: Si votre tuple est court, le couper en tranches et de les concaténer.
Si elle est longue, faire la liste de conversion!
Comme Chasseur McMillen a écrit dans les commentaires, les tuples sont immuables, vous devez créer un nouveau tuple dans le but d'atteindre cet objectif. Par exemple:
Pas que c'est supérieur, mais si quelqu'un est curieux, il peut être fait sur une ligne avec:
Je crois que cette technique répond à la question, mais ne pas le faire à la maison. À l'heure actuelle, toutes les réponses impliquent la création d'un nouveau tuple, mais vous pouvez utiliser
ctypes
de modifier un tuple dans la mémoire. En s'appuyant sur divers détails de mise en œuvre de Disponible sur un système 64 bits, une façon de le faire est comme suit:C'est un simple one-liner à l'aide de idoimatic Python:
EDIT: Cela ne fonctionne pas sur les tuples avec les entrées en double encore!!
Basé sur Pooya l'idée de:
Si vous envisagez de le faire souvent (que vous ne devriez pas depuis des n-uplets sont inmutable pour une raison quelconque), vous devriez faire quelque chose comme ceci:
Ou basé sur Jon idée:
basé sur Jonl'Idée et chers Trufa
il change de toutes vos anciennes valeurs occurrences
En premier lieu, demandez-vous pourquoi vous souhaitez muter votre
tuple
. Il ya une raison pourquoi chaînes et de tuple sont immuables dans Ptyhon, si vous souhaitez muter votretuple
il devrait probablement être unlist
à la place.Deuxième, si vous souhaitez muter votre tuple ensuite, vous pouvez convertir votre
tuple
à unlist
puis de le convertir en arrière, et de réaffecter le nouveau tuple à la même variable. C'est une grande si vous allez seulement à muter votre tuple une fois. Sinon, personnellement, je pense que c'est contre-intuitif. Parce que C'est essentiellement la création d'un nouveau tuple et à chaque fois si vous souhaitez muter le tuple vous auriez à effectuer la conversion. Aussi, Si vous lisez le code, il serait trompeur de penser, pourquoi ne pas simplement créer unlist
? Mais c'est agréable parce qu'il ne nécessite pas de n'importe quelle bibliothèque.Je suggère d'utiliser
mutabletuple(typename, field_names, default=MtNoDefault)
de mutabletuple 0.2. Personnellement, je pense que de cette façon est un plus intuitive et lisible. La lecture personnelle le code serait de savoir que l'auteur a l'intention de muter ce n-uplet dans l'avenir. L'inconvénient compare à lalist
méthode de conversion ci-dessus, c'est que cela vous oblige à importer d'autres py fichier.TL;DR: N'essayez pas de le muter
tuple
. si vous le faites et c'est une opération ponctuelle de convertirtuple
de liste, de muter, tournerlist
dans une nouvelletuple
, et de réaffecter retour à la variable contenant vieuxtuple
. Si les désirstuple
et en quelque sorte vouloir éviterlist
et souhaitez muter plus d'une fois alors créermutabletuple
.Vous ne pouvez pas. Si vous souhaitez la modifier, vous devez utiliser une liste au lieu d'un n-uplet.
Notez que vous pouvez à la place faire un nouveau tuple qui est la nouvelle valeur de son premier élément.
J'ai trouvé la meilleure façon de modifier les tuples est de recréer le tuple à l'aide de la version précédente de la base.
Voici un exemple que j'ai utilisé pour faire une version plus légère de couleur (je l'avais déjà ouvert à l'époque):
Ce qu'il fait, est-il passe par le tuple 'couleur' et lit chaque élément, fait quelque chose pour elle, et, enfin, ajoute le nouveau tuple.
Donc ce que vous voulez serait quelque chose comme:
Spécifiques de l'un ne fonctionne pas, mais le concept est ce qu'il vous faut.
c'est le concept.
je l'ai fait:
et pour changer, il suffit de faire
et u peut changer d'un n-uplet 😀
ici est-il copié exactement à partir du RALENTI
x = (y)
ne fait rien, mais affecte de y à x.Vous pouvez modifier la valeur du tuple à l'aide de la copie par référence