Eu sou novo em python, então esta questão pode ser um pouco básica. Eu tenho uma tupla chamada values
que contém o seguinte:
('275', '54000', '0.0', '5000.0', '0.0')
Quero alterar o primeiro valor (ou seja, 275
) nesta tupla, mas entendo que as tuplas são imutáveis, portanto values[0] = 200
não funcionarão. Como posso conseguir isso?
Respostas:
Primeiro você precisa perguntar, por que você quer fazer isso?
Mas é possível via:
Mas se você precisar mudar as coisas, é melhor mantê-lo como um
list
fonte
Dependendo do problema, o fatiamento pode ser uma solução realmente interessante:
Isso permite adicionar vários elementos ou também substituir alguns elementos (especialmente se forem "vizinhos". No caso acima, a conversão para uma lista é provavelmente mais apropriada e legível (mesmo que a notação de fatiamento seja muito menor).
fonte
Bem, como Trufa já mostrou, existem basicamente duas maneiras de substituir o elemento de uma tupla em um determinado índice. Converta a tupla em uma lista, substitua o elemento e converta novamente ou construa uma nova tupla por concatenação.
Então, qual método é melhor, ou seja, mais rápido?
Acontece que para tuplas curtas (no Python 3.3), a concatenação é realmente mais rápida!
No entanto, se observarmos as tuplas mais longas, a conversão da lista é o caminho a seguir:
Para tuplas muito longas, a conversão de lista é substancialmente melhor!
Além disso, o desempenho do método de concatenação depende do índice no qual substituímos o elemento. Para o método de lista, o índice é irrelevante.
Portanto: se sua tupla for curta, corte e concatene. Se for longo, faça a conversão da lista!
fonte
É possível com um liner:
fonte
values
com isso?i = 2; values = (*values[:i], '300', *values[i+1:])
Não que isso seja superior, mas se alguém estiver curioso, isso pode ser feito em uma linha com:
fonte
tuple = tuple(200 if i == 0 else _ for i, _ in enumerate(tuple))
? (Por que não gerador compreensão?)Acredito que isso responda tecnicamente à pergunta, mas não faça isso em casa. No momento, todas as respostas envolvem a criação de uma nova tupla, mas você pode usá-lo
ctypes
para modificar uma tupla na memória. Contando com vários detalhes de implementação do CPython em um sistema de 64 bits, uma maneira de fazer isso é a seguinte:fonte
Como Hunter McMillen escreveu nos comentários, as tuplas são imutáveis, você precisa criar uma nova tupla para conseguir isso. Por exemplo:
fonte
EDIT: Isso ainda não funciona em tuplas com entradas duplicadas !!
Com base na idéia de Pooya :
Se você planeja fazer isso com frequência (o que você não deve fazer, já que as tuplas são imutáveis por um motivo), faça algo assim:
Ou com base na ideia de Jon :
fonte
Primeiro, pergunte a si mesmo por que você deseja alterar o seu
tuple
. Há uma razão pela qual cordas e tuplas são imutáveis em Ptyhon ; se você deseja alterar o seutuple
, provavelmente deve ser umlist
.Segundo, se você ainda deseja alterar sua tupla, pode convertê-lo
tuple
em um elist
depois convertê-lo novamente e reatribuir a nova tupla à mesma variável. Isso é ótimo se você só vai mudar sua tupla uma vez . Caso contrário, eu pessoalmente acho isso contra-intuitivo. Porque é essencialmente a criação de uma nova tupla e, sempre que você desejar alterar a tupla, você terá que realizar a conversão. Além disso, se você ler o código, seria confuso pensar por que não criar umlist
? Mas é legal porque não requer nenhuma biblioteca.Eu sugiro usar
mutabletuple(typename, field_names, default=MtNoDefault)
do mutabletuple 0.2 . Pessoalmente, acho que esse caminho é mais intuitivo e legível. A leitura pessoal do código saberia que o escritor pretende alterar essa tupla no futuro. A desvantagem se compara aolist
método de conversão acima é que isso requer que você importe um arquivo py adicional.TL; DR : Não tente fazer mutação
tuple
. se você fizer isso e for uma operação única, convertatuple
para lista, modifique-a, transforme-alist
em uma novatuple
e reatribua-a novamente à variável antigatuple
. Se os desejostuple
e de alguma forma querem evitarlist
e querem mudar mais de uma vez, criemutabletuple
.fonte
baseado na idéia de Jon e na querida Trufa
altera todas as ocorrências de valores antigos
fonte
Você não pode. Se você quiser alterá-lo, precisará usar uma lista em vez de uma tupla.
Observe que você pode criar uma nova tupla que tenha o novo valor como seu primeiro elemento.
fonte
Encontrei a melhor maneira de editar tuplas é recriar a tupla usando a versão anterior como base.
Aqui está um exemplo que eu usei para criar uma versão mais clara de uma cor (eu já estava aberta na época):
O que ele faz é percorrer a "cor" da tupla e ler cada item, fazer alguma coisa e, finalmente, adicioná-lo à nova tupla.
Então, o que você gostaria seria algo como:
Esse específico não funciona, mas o conceito é o que você precisa.
esse é o conceito.
fonte
Estou atrasado para o jogo, mas acho que a maneira mais simples , mais amigável e mais rápida de usar os recursos (dependendo da situação) , é sobrescrever a tupla em si. Como isso eliminaria a necessidade da criação de lista e variável e é arquivado em uma linha.
Mas: isso é útil apenas para tuplas bastante pequenas e também limita você a um valor de tupla fixo; no entanto, esse é o caso das tuplas na maioria das vezes.
Portanto, nesse caso em particular, ficaria assim:
fonte
tldr; a "solução alternativa" está criando um novo objeto de tupla, sem modificar o original
Embora essa seja uma pergunta muito antiga, alguém me contou sobre essa loucura das tuplas mutantes do Python. Fiquei muito surpreso / intrigado e, pesquisando no Google, cheguei aqui (e outras amostras semelhantes online)
Fiz alguns testes para provar minha teoria
Nota
==
valoriza a igualdade enquanto igualdadeis
referencial (obj é a mesma instância que obj b)Rendimentos:
fonte
Você não pode modificar itens na tupla, mas pode modificar propriedades de objetos mutáveis nas tuplas (por exemplo, se esses objetos são listas ou objetos de classe reais)
Por exemplo
fonte
eu fiz isso:
e para mudar, basta fazer
e você pode alterar uma tupla: D
aqui está copiado exatamente do IDLE
fonte
x = (y)
não faz nada, mas atribui y a x.Você pode alterar o valor da tupla usando copiar por referência
fonte