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.