Adicionar string em uma certa posição no Python

157

Existe alguma função no Python que eu possa usar para inserir um valor em uma determinada posição de uma string?

Algo assim:

"3655879ACB6"então na posição 4 adicione "-"para se tornar"3655-879ACB6"

Michel Andrade
fonte

Respostas:

272

Não. As seqüências de caracteres Python são imutáveis.

>>> s='355879ACB6'
>>> s[4:4] = '-'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

No entanto, é possível criar uma nova sequência que tenha o caractere inserido:

>>> s[:4] + '-' + s[4:]
'3558-79ACB6'
Ignacio Vazquez-Abrams
fonte
9
Adicionando a isso, você pode usar índices negativos para obter uma posição da direita, por exemplos[:-4]
Reuben L.
Usando o formato mais recente de linguagem de strings: '{0} - {1}'. Format (s [: 4], s [4:])
srock
60

Isso parece muito fácil:

>>> hash = "355879ACB6"
>>> hash = hash[:4] + '-' + hash[4:]
>>> print hash
3558-79ACB6

No entanto, se você gosta de algo como uma função, faça o seguinte:

def insert_dash(string, index):
    return string[:index] + '-' + string[index:]

print insert_dash("355879ACB6", 5)
Mario César
fonte
26

Como as strings são imutáveis, outra maneira de fazer isso seria transformar a string em uma lista, que pode ser indexada e modificada sem nenhum truque de fatiar. No entanto, para retornar a lista a uma string, você precisará usar .join()uma string vazia.

>>> hash = '355879ACB6'
>>> hashlist = list(hash)
>>> hashlist.insert(4, '-')
>>> ''.join(hashlist)
'3558-79ACB6'

Não tenho certeza de como isso se compara ao desempenho, mas sinto que é mais fácil para os olhos do que as outras soluções. ;-)

jathanism
fonte
7

Função simples para fazer isso:

def insert_str(string, str_to_insert, index):
    return string[:index] + str_to_insert + string[index:]
vatsug
fonte
5

Eu criei um método muito útil para adicionar uma string em uma determinada posição no Python :

def insertChar(mystring, position, chartoinsert ):
    longi = len(mystring)
    mystring   =  mystring[:position] + chartoinsert + mystring[position:] 
    return mystring  

por exemplo:

a = "Jorgesys was here!"

def insertChar(mystring, position, chartoinsert ):
    longi = len(mystring)
    mystring   =  mystring[:position] + chartoinsert + mystring[position:] 
    return mystring   

#Inserting some characters with a defined position:    
print(insertChar(a,0, '-'))    
print(insertChar(a,9, '@'))    
print(insertChar(a,14, '%'))   

teremos como saída:

-Jorgesys was here!
Jorgesys @was here!
Jorgesys was h%ere!
Jorgesys
fonte
8
Por que você calcula o comprimento da string tho?
Yytsi 10/08/16
2
Talvez ele quisesse verificar se o índice era menor que o comprimento da corda ... e depois esqueceu.
sce
O Python convencionalmente usa maiúsculas e minúsculas para nomes de funções, não camel case.
Michael Bates
2

Eu acho que as respostas acima são boas, mas eu explicaria que existem alguns efeitos colaterais inesperados, mas bons para eles ...

def insert(string_s, insert_s, pos_i=0):
    return string_s[:pos_i] + insert_s + string_s[pos_i:]

Se o índice pos_i for muito pequeno (muito negativo), a sequência de inserção será anexada. Se for muito longa, a sequência de inserção será anexada. Se pos_i estiver entre -len (string_s) e + len (string_s) - 1, a string de inserção será inserida no local correto.

Gary02127
fonte
0

Python 3.6+ usando f-string:

mys = '1362511338314'
f"{mys[:10]}_{mys[10:]}"

'1362511338_314'
DarinP
fonte
-3

Se você deseja muitas inserções

from rope.base.codeanalyze import ChangeCollector

c = ChangeCollector(code)
c.add_change(5, 5, '<span style="background-color:#339999;">')
c.add_change(10, 10, '</span>')
rend_code = c.get_changed()
enomad
fonte
Não está claro para mim de onde vem a biblioteca que você está importando ou qual seria a saída.
chrisfs