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?

Rasmi Ranjan Nayak
źródło
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.

NPE
źródło
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.

Crowman
źródło
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!
wim
źródło
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[:]
Burhan Khalid
źródło
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:])
Jean-Emile Leconte II
źródło
0

A co z tym rozwiązaniem:

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

user2643900
źródło
-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
Devzzone
źródło