Obiekt „str” nie obsługuje przypisywania pozycji w Pythonie


130

Chciałbym odczytać kilka znaków z ciągu i umieścić go w innym ciągu (tak jak w C).

Więc mój kod jest taki jak poniżej

import string
import re
str = "Hello World"
j = 0
srr = ""
for i in str:
    srr[j] = i #'str' object does not support item assignment 
    j = j + 1
print (srr)

W C kod może być

i = j = 0; 
while(str[i] != '\0')
{
srr[j++] = str [i++];
}

Jak mogę zaimplementować to samo w Pythonie?


19
Przy okazji, nie nazywaj swoich zmiennych po funkcjach wbudowanych w Pythonie. Jeśli użyjesz strtutaj zmiennej jako zmiennej, nie będziesz w stanie wykonywać konwersji ciągów z str(var_that_is_not_a_string)porównaniami typu lub typami, takimi jak type(var_with_unknown_type) == str.
Joel Cornett

Odpowiedzi:


100

W Pythonie ciągi znaków są niezmienne, więc nie można zmieniać ich znaków w miejscu.

Możesz jednak wykonać następujące czynności:

for i in str:
    srr += i

Powodem, dla którego to działa, jest to, że jest to skrót do:

for i in str:
    srr = srr + i

Powyższe tworzy nowy ciąg z każdą iteracją i przechowuje odniesienie do tego nowego ciągu w srr.


W takim razie, jeśli miałbym odczytać znaki z ciągu i skopiować je gdzieś, to jak mogę to zrobić?
Rasmi Ranjan Nayak

1
@RasmiRanjanNayak: To zależy od tego, co musisz zrobić z tymi postaciami. W mojej odpowiedzi pokazałem, jak można je dołączyć do innego ciągu.
NPE

Chciałbym napisać program „Hello world” do „World Hello”. Więc mój kod powinien szukać spacji („”). Szukałem więc pomocy
Rasmi Ranjan Nayak

5
@RasmiRanjanNayak:print " ".join(reversed("Hello world".split())).capitalize()
Joel

2
@aix: To było dosłownie kilka sekund po sobie. : D
Joel Cornett

113

Pozostałe odpowiedzi są poprawne, ale możesz oczywiście zrobić coś takiego:

>>> str1 = "mystring"
>>> list1 = list(str1)
>>> list1[5] = 'u'
>>> str1 = ''.join(list1)
>>> print(str1)
mystrung
>>> type(str1)
<type 'str'>

jeśli naprawdę chcesz.


14

Ciągi znaków w Pythonie są niezmienne, więc to, co próbujesz zrobić w C, będzie po prostu niemożliwe w Pythonie. Będziesz musiał utworzyć nowy ciąg.

Chciałbym odczytać kilka znaków z ciągu i umieścić go w innym ciągu.

Następnie użyj kawałka sznurka:

>>> s1 = 'Hello world!!'
>>> s2 = s1[6:12]
>>> print s2
world!

5

Jak wspomniano aix - ciągi znaków w Pythonie są niezmienne (nie można ich zmieniać w miejscu).

To, co próbujesz zrobić, można zrobić na wiele sposobów:

# Copy the string

foo = 'Hello'
bar = foo

# Create a new string by joining all characters of the old string

new_string = ''.join(c for c in oldstring)

# Slice and copy
new_string = oldstring[:]

1

Inne podejście, jeśli chcesz zamienić konkretną postać na inną:

def swap(input_string):
   if len(input_string) == 0:
     return input_string
   if input_string[0] == "x":
     return "y" + swap(input_string[1:])
   else:
     return input_string[0] + swap(input_string[1:])

0

A co z tym rozwiązaniem:

str = "Hello World" (jak podano w problemie) srr = str + ""


-2

Cześć, powinieneś wypróbować metodę dzielenia ciągów:

i = "Hello world"
output = i.split()

j = 'is not enough'

print 'The', output[1], j
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.