Qual é a maneira mais fácil no Python de substituir um caractere em uma string?
Por exemplo:
text = "abcdefg";
text[1] = "Z";
^
Não modifique strings.
Trabalhe com eles como listas; transformá-los em strings somente quando necessário.
>>> s = list("Hello zorld")
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd']
>>> s[6] = 'W'
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> "".join(s)
'Hello World'
Strings Python são imutáveis (ou seja, não podem ser modificadas). Existem muitas razões para isso. Use as listas até não ter escolha, e depois transforme-as em strings.
MID
devido a fatias:s[:index] + c + s[index+1:]
Método mais rápido?
Existem três maneiras. Para os que procuram velocidade, eu recomendo o "Método 2"
Método 1
Dado por esta resposta
O que é bem lento em comparação com o "Método 2"
Método 2 (MÉTODO RÁPIDO)
Dado por esta resposta
O que é muito mais rápido:
Método 3:
Matriz de bytes:
fonte
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
duas vezes mais lento que o mais rápido.fonte
Seqüências de caracteres Python são imutáveis, você as altera fazendo uma cópia.
A maneira mais fácil de fazer o que você quer é provavelmente:
Os
text[1:]
retornos a corda notext
da posição 1 para o final, as posições contar de 0 so '1' é o segundo personagem.editar: você pode usar a mesma técnica de corte de cadeia para qualquer parte da cadeia
Ou se a letra aparecer apenas quando você puder usar a técnica de pesquisa e substituição sugerida abaixo
fonte
Começando com o python 2.6 e python 3, você pode usar bytearrays que são mutáveis (podem ser alterados em termos de elementos, diferentemente das strings):
edit: Alterado str para s
edit2: Como o Alquimista de dois bits mencionado nos comentários, esse código não funciona com unicode.
fonte
bytearray(s)
, nãobytearray(str)
. Por outro lado, este irá produzir:TypeError: string argument without an encoding
. Se você especificar uma codificação, receberáTypeError: an integer is required
. Isso ocorre com o unicode do Python 3 ou do Python 2. Se você fizer isso no Python 2 (com uma segunda linha corrigida), ele não funcionará para caracteres não ASCII, pois eles podem não ter apenas um byte. Experimentes = 'Héllo'
e você receberá'He\xa9llo'
.s = u'abcdefg'
.Como outras pessoas disseram, geralmente as seqüências de caracteres Python são imutáveis.
No entanto, se você estiver usando o CPython, a implementação em python.org, é possível usar ctypes para modificar a estrutura de strings na memória.
Aqui está um exemplo em que eu uso a técnica para limpar uma string.
Marcar dados como sensíveis em python
Menciono isso por uma questão de perfeição, e esse deve ser seu último recurso, pois é um hack.
fonte
str
não é o tipo certo para você. Só não use. Use algo como embytearray
vez disso. (Melhor ainda, envolva-o em algo que permita tratá-lo mais ou menos como dados opacos, para que você realmente não possa recuperar um delesstr
, para protegê-lo de acidentes. Pode haver uma biblioteca para isso. Não faço ideia.)Este código não é meu. Não conseguia me lembrar do formulário do site onde o peguei. Curiosamente, você pode usar isso para substituir um caractere ou mais por um ou mais caracteres. Embora essa resposta seja muito tardia, novatos como eu (a qualquer momento) podem achar útil.
Alterar função de texto.
fonte
l
.mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
. Link para docNa verdade, com strings, você pode fazer algo assim:
Basicamente, estou "adicionando" + "strings" em uma nova string :).
fonte
se seu mundo for 100%
ascii/utf-8
(muitos casos de uso se encaixam nessa caixa):python 3.7.3
fonte
Gostaria de adicionar outra maneira de alterar um caractere em uma string.
Quão mais rápido é quando comparado a transformar a string em lista e substituir o i-ésimo valor e depois juntar-se novamente?
Abordagem de lista
Minha solução
fonte