Dodaj ciąg w określonej pozycji w Pythonie

157

Czy w Pythonie jest jakaś funkcja, której mogę użyć do wstawienia wartości w określonej pozycji ciągu?

Coś takiego:

"3655879ACB6"następnie na pozycji 4 dodaj, "-"aby stać"3655-879ACB6"

Michel Andrade
źródło

Odpowiedzi:

272

Nie. Ciągi Pythona są niezmienne.

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

Możliwe jest jednak utworzenie nowego ciągu zawierającego wstawiony znak:

>>> s[:4] + '-' + s[4:]
'3558-79ACB6'
Ignacio Vazquez-Abrams
źródło
9
Dodając do tego, możesz użyć indeksów ujemnych, aby uzyskać pozycję z prawej strony, np.s[:-4]
Reuben L.
Używając nowszego żargonu z ciągami formatującymi: '{0} - {1}'. Format (s [: 4], s [4:])
srock
60

Wydaje się to bardzo proste:

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

Jeśli jednak podoba ci się coś takiego jak funkcja, zrób tak:

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

print insert_dash("355879ACB6", 5)
Mario César
źródło
26

Ponieważ łańcuchy są niezmienne, innym sposobem na to byłoby przekształcenie ciągu w listę, która może być następnie indeksowana i modyfikowana bez żadnych sztuczek związanych z wycinaniem. Jednak, aby przywrócić listę z powrotem do łańcucha, musisz użyć .join()pustego ciągu.

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

Nie jestem pewien, jak wypada to na tle wydajności, ale wydaje mi się, że jest to łatwiejsze dla oczu niż inne rozwiązania. ;-)

jatanizm
źródło
7

Prosta funkcja, aby to osiągnąć:

def insert_str(string, str_to_insert, index):
    return string[:index] + str_to_insert + string[index:]
vatsug
źródło
5

Zrobiłem bardzo przydatną metodę dodawania ciągu znaków w określonej pozycji w Pythonie :

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

na przykład:

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, '%'))   

będziemy mieli na wyjściu:

-Jorgesys was here!
Jorgesys @was here!
Jorgesys was h%ere!
Jorgesys
źródło
8
Dlaczego obliczasz długość struny?
Yytsi,
2
Może chciał sprawdzić, czy indeks jest krótszy niż długość łańcucha ... a potem zapomniał.
sce
Python tradycyjnie używa znaków podkreślenia dla nazw funkcji, a nie wielkich liter.
Michael Bates
2

Myślę, że powyższe odpowiedzi są w porządku, ale wyjaśniłbym, że są na nich nieoczekiwane, ale dobre efekty uboczne ...

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

Jeśli indeks pos_i jest bardzo mały (zbyt ujemny), ciąg wstawiania jest dołączany na początku. Jeśli jest zbyt długi, dołączany jest ciąg wstawiania. Jeśli pos_i znajduje się między -len (string_s) a + len (string_s) - 1, to ciąg wstawiania zostanie wstawiony we właściwe miejsce.

Gary02127
źródło
0

Python 3.6+ używający f-string:

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

daje

'1362511338_314'
DarinP
źródło
-3

Jeśli chcesz mieć wiele wkładek

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
źródło
Nie jest dla mnie jasne, skąd pochodzi importowana biblioteka ani jaki będzie wynik.
chrisfs