Я новичок в python, поэтому этот вопрос может быть немного базовым. У меня есть кортеж, values
который содержит следующее:
('275', '54000', '0.0', '5000.0', '0.0')
Я хочу изменить первое значение (т.е. 275
) в этом кортеже, но я понимаю, что кортежи неизменяемы, поэтому values[0] = 200
работать не будет. Как я могу этого добиться?
Ответы:
Сначала нужно спросить, зачем вам это нужно?
Но это возможно через:
Но если вам нужно что-то изменить, вам, вероятно, лучше оставить это как
list
источник
В зависимости от вашей проблемы нарезка может быть действительно отличным решением:
Это позволяет вам добавлять несколько элементов или также заменять несколько элементов (особенно, если они являются «соседями». В приведенном выше случае приведение к списку, вероятно, более уместно и читабельно (хотя обозначение срезов намного короче).
источник
Как уже показал Труфа, есть два основных способа заменить элемент кортежа по заданному индексу. Либо преобразуйте кортеж в список, замените элемент и преобразуйте обратно, либо создайте новый кортеж путем конкатенации.
Итак, какой метод лучше, то есть быстрее?
Оказывается, для коротких кортежей (в Python 3.3) конкатенация на самом деле быстрее!
Тем не менее, если мы посмотрим на более длинные кортежи, преобразование списка - это путь:
Для очень длинных кортежей преобразование списков значительно лучше!
Кроме того, производительность метода конкатенации зависит от индекса, по которому мы заменяем элемент. Для метода списка индекс не имеет значения.
Итак: если ваш кортеж короткий, нарежьте и объедините. Если он длинный, сделайте преобразование списка!
источник
Возможно с одним лайнером:
источник
values
?i = 2; values = (*values[:i], '300', *values[i+1:])
Не то чтобы это лучше, но, если кому-то интересно, это можно сделать в одной строке:
источник
tuple = tuple(200 if i == 0 else _ for i, _ in enumerate(tuple))
? (Почему не генератор понимания?)Я считаю, что это технически ответ на вопрос, но не делайте этого дома. На данный момент все ответы включают создание нового кортежа, но вы можете использовать его
ctypes
для изменения кортежа в памяти. Опираясь на различные детали реализации CPython в 64-битной системе, можно сделать это следующим образом:источник
Как написал в комментариях Хантер Макмиллен, кортежи неизменяемы, для этого вам нужно создать новый кортеж. Например:
источник
РЕДАКТИРОВАТЬ: это еще не работает с кортежами с повторяющимися записями !!
По идее Пуйи :
Если вы планируете делать это часто (чего не следует делать, поскольку кортежи по какой-то причине неизменяемы), вам следует сделать что-то вроде этого:
Или на основе идеи Джона :
источник
Фрист, спросите себя, почему вы хотите изменить свой
tuple
. Есть причина, по которой строки и кортеж неизменяемы в Ptyhon , если вы хотите изменить свой,tuple
то, вероятно,list
вместо этого он должен быть .Во-вторых, если вы все еще хотите изменить свой кортеж, вы можете преобразовать его
tuple
в a,list
затем преобразовать его обратно и переназначить новый кортеж той же переменной. Это замечательно, если вы собираетесь изменить кортеж только один раз . В противном случае я лично считаю, что это нелогично. Потому что он по сути создает новый кортеж, и каждый раз, если вы хотите изменить кортеж, вам придется выполнять преобразование. Также, если вы читаете код, было бы непонятно, почему бы просто не создатьlist
? Но это приятно, потому что не требует никакой библиотеки.Я предлагаю использовать
mutabletuple(typename, field_names, default=MtNoDefault)
from mutabletuple 0.2 . Я лично считаю, что этот способ более интуитивно понятен и удобочитаем. Личное чтение кода должно знать, что писатель намеревается изменить этот кортеж в будущем. Обратной стороной по сравнению сlist
описанным выше методом преобразования является то, что вам необходимо импортировать дополнительный файл py.TL; DR : Не пытайтесь мутировать
tuple
. если вы это сделаете, и это будет одноразовая операция, преобразоватьtuple
в список, изменить его, превратитьlist
в новыйtuple
и переназначить обратно переменной, содержащей старыйtuple
. Если выtuple
хотите чего-то избежатьlist
и хотите видоизменить более одного раза, тогда создавайтеmutabletuple
.источник
на основе Идеи Джона и дорогой Труфа
он изменяет все ваши старые вхождения значений
источник
Вы не можете. Если вы хотите его изменить, вам нужно использовать список вместо кортежа.
Обратите внимание, что вместо этого вы можете создать новый кортеж с новым значением в качестве первого элемента.
источник
Я обнаружил, что лучший способ редактировать кортежи - это воссоздать кортеж, используя предыдущую версию в качестве основы.
Вот пример, который я использовал для создания более светлой версии цвета (у меня он уже был открыт в то время):
Что он делает, так это то, что он просматривает «цвет» кортежа и читает каждый элемент, что-то делает с ним и, наконец, добавляет его в новый кортеж.
Так что вам нужно что-то вроде:
Этот конкретный вариант не работает, но концепция - это то, что вам нужно.
это концепция.
источник
Я опаздываю в игру, но я думаю, что самый простой , экономичный и быстрый способ (в зависимости от ситуации) - это перезаписать сам кортеж. Так как это избавит от необходимости создавать список и переменную и архивируется в одну строку.
Но: это удобно только для довольно небольших кортежей, а также ограничивает вас фиксированным значением кортежа, тем не менее, в любом случае это происходит с кортежами большую часть времени.
В данном конкретном случае это будет выглядеть так:
источник
tldr; «обходным путем» является создание нового объекта кортежа, а не изменение исходного
Хотя это очень старый вопрос, кто-то рассказал мне об этом безумии изменения кортежей Python. Что я был очень удивлен / заинтригован, и, немного погуглил, я попал сюда (и другие похожие образцы в Интернете)
Я провел тест, чтобы доказать свою теорию
Примечание
==
оценивает равенство, в то времяis
как ссылочное равенство (obj a тот же экземпляр, что и obj b)Урожайность:
источник
Вы не можете изменять элементы в кортеже, но можете изменять свойства изменяемых объектов в кортежах (например, если эти объекты являются списками или фактическими объектами класса)
Например
источник
я сделал это:
и чтобы изменить, просто сделай
и вы можете изменить кортеж: D
вот оно в точности скопировано из IDLE
источник
x = (y)
ничего не делает, но присваивает y значению x.Вы можете изменить значение кортежа, используя копию по ссылке
источник