Je suis nouveau sur python, donc cette question pourrait être un peu basique. J'ai un tuple appelé values
qui contient ce qui suit:
('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 et values[0] = 200
ne fonctionneront donc pas. Comment puis-je atteindre cet objectif?
Réponses:
Vous devez d'abord vous demander pourquoi vous voulez faire cela?
Mais c'est possible via:
Mais si vous avez besoin de changer les choses, vous feriez probablement mieux de le garder
list
la source
En fonction de votre problème, le tranchage peut être une solution vraiment intéressante:
Cela vous permet d'ajouter plusieurs éléments ou aussi de remplacer quelques éléments (surtout s'ils sont "voisins". Dans le cas ci-dessus, le cast dans une liste est probablement plus approprié et lisible (même si la notation de découpage est beaucoup plus courte).
la source
Eh bien, comme Trufa l'a déjà montré, il existe essentiellement deux façons de remplacer l'élément d'un tuple à un index donné. Convertissez le tuple en liste, remplacez l'élément et reconvertissez-le, ou construisez un nouveau tuple par concaténation.
Alors, quelle méthode est la meilleure, c'est-à-dire la plus rapide?
Il s'avère que pour les tuples courts (sur Python 3.3), la concaténation est en fait plus rapide!
Pourtant, si nous regardons des tuples plus longs, la conversion de liste est la voie à suivre:
Pour les tuples très longs, la conversion de liste est nettement meilleure!
De plus, les performances de la méthode de concaténation dépendent de l'index auquel nous remplaçons l'élément. Pour la méthode de la liste, l'index n'est pas pertinent.
Donc: si votre tuple est court, découpez et concaténez. Si c'est long, faites la conversion de liste!
la source
C'est possible avec une seule doublure:
la source
values
avec cela?i = 2; values = (*values[:i], '300', *values[i+1:])
Non pas que ce soit supérieur, mais si quelqu'un est curieux, cela peut être fait sur une seule ligne avec:
la source
tuple = tuple(200 if i == 0 else _ for i, _ in enumerate(tuple))
? (Pourquoi pas la compréhension du générateur?)Je pense que cela répond techniquement à la question, mais ne le faites pas à la maison. Pour le moment, toutes les réponses impliquent la création d'un nouveau tuple, mais vous pouvez l'utiliser
ctypes
pour modifier un tuple en mémoire. En vous appuyant sur divers détails d'implémentation de CPython sur un système 64 bits, une façon de le faire est la suivante:la source
Comme Hunter McMillen l'a écrit dans les commentaires, les tuples sont immuables, vous devez créer un nouveau tuple pour y parvenir. Par exemple:
la source
EDIT: Cela ne fonctionne pas sur les tuples avec des entrées en double !!
Basé sur l'idée de Pooya :
Si vous prévoyez de faire cela souvent (ce que vous ne devriez pas car les tuples sont inmubles pour une raison), vous devriez faire quelque chose comme ceci:
Ou basé sur l'idée de Jon :
la source
Premièrement, demandez-vous pourquoi vous voulez muter votre
tuple
. Il y a une raison pour laquelle les chaînes et le tuple sont immuables dans Ptyhon , si vous voulez muter votretuple
alors il devrait probablement être un à lalist
place.Deuxièmement, si vous souhaitez toujours muter votre tuple, vous pouvez le convertir
tuple
en a,list
puis le reconvertir et réaffecter le nouveau tuple à la même variable. C'est génial si vous n'allez faire muter votre tuple qu'une seule fois . Sinon, je pense personnellement que c'est contre-intuitif. Parce que cela crée essentiellement un nouveau tuple et à chaque fois que vous souhaitez muter le tuple, vous devrez effectuer la conversion. Aussi, si vous lisez le code, il serait déroutant de penser pourquoi ne pas simplement créer unlist
? Mais c'est bien car il ne nécessite aucune bibliothèque.Je suggère d'utiliser
mutabletuple(typename, field_names, default=MtNoDefault)
de mutabletuple 0.2 . Je pense personnellement que cette façon est plus intuitive et lisible. La lecture personnelle du code saurait que l'auteur a l'intention de muter ce tuple à l'avenir. L'inconvénient par rapport à lalist
méthode de conversion ci-dessus est que cela vous oblige à importer un fichier py supplémentaire.TL; DR : N'essayez pas de muter
tuple
. si vous le faites et que c'est une opération unique, convertissez-latuple
en liste, faites-la muter, transformez-lalist
en une nouvelletuple
et réaffectez-la à la variable contenant oldtuple
. Si les désirstuple
et d'une manière ou d'une autre veulent éviterlist
et veulent muter plus d'une fois, créezmutabletuple
.la source
basé sur l'idée de Jon et la chère Trufa
il modifie toutes vos anciennes occurrences de valeurs
la source
Vous ne pouvez pas. Si vous souhaitez le modifier, vous devez utiliser une liste au lieu d'un tuple.
Notez que vous pouvez à la place créer un nouveau tuple qui a la nouvelle valeur comme premier élément.
la source
J'ai trouvé que le meilleur moyen de modifier les tuples est de recréer le tuple en utilisant la version précédente comme base.
Voici un exemple que j'ai utilisé pour créer une version plus claire d'une couleur (je l'avais déjà ouverte à l'époque):
Ce qu'il fait, c'est qu'il passe par le tuple 'color' et lit chaque élément, y fait quelque chose et l'ajoute finalement au nouveau tuple.
Donc, ce que vous voudriez serait quelque chose comme:
Celui-là spécifique ne fonctionne pas, mais le concept est ce dont vous avez besoin.
c'est ça le concept.
la source
Je suis en retard au jeu mais je pense que le moyen le plus simple , le plus convivial et le plus rapide (selon la situation) , est d'écraser le tuple lui-même. Étant donné que cela supprimerait le besoin de création de liste et de variable et est archivé sur une seule ligne.
Mais: Ceci n'est pratique que pour les tuples plutôt petits et vous limite également à une valeur de tuple fixe, néanmoins, c'est le cas pour les tuples la plupart du temps de toute façon.
Donc, dans ce cas particulier, cela ressemblerait à ceci:
la source
tldr; la "solution de contournement" est de créer un nouvel objet tuple, sans modifier réellement l'original
Bien que ce soit une question très ancienne, quelqu'un m'a parlé de cette folie des tuples mutants de Python. Ce qui m'a beaucoup surpris / intrigué, et en faisant quelques recherches sur Google, j'ai atterri ici (et d'autres échantillons similaires en ligne)
J'ai fait un test pour prouver ma théorie
La note
==
valorise l'égalité tandisis
que l'égalité référentielle (est obj a la même instance que obj b)Rendements:
la source
Vous ne pouvez pas modifier les éléments dans le tuple, mais vous pouvez modifier les propriétés des objets mutables dans les tuples (par exemple, si ces objets sont des listes ou des objets de classe réels)
Par exemple
la source
j'ai fait ça:
et pour changer, fais juste
et vous pouvez changer un tuple: D
le voici copié exactement de IDLE
la source
x = (y)
ne fait rien mais assigne y à x.Vous pouvez changer la valeur de tuple en utilisant la copie par référence
la source