如何迭代字符串并正确替换python中的特定字符?

时间:2017-11-03 04:46:04

标签: python string replace char

我试图在python中创建一种可发音的加密语言。我想迭代一个字符串并改变,只是一些元音。

我认为这可以通过数组chars["a","o"]完成,其中第一个字母应该替换为第二个字母。

我正在尝试使用此代码。

import string

string = "Hello, my name is fesker"
chars =[
       ["a","o"],
       ["e","i"],
       ["i","u"],
       ["o","e"],
       ["u","a"],
       ["H","J"],
       ]

for i in range(len(string)):
    print(string[i])
    replaced=False

    for x in range(len(chars)):

        if string[i] in chars[x][0] and replaced == False:
           string = string.replace(string[i],chars[x][1])
           replaced=True
           print("Replace",chars[x][0],"with",chars[x][1])


print(string)

我不明白这一点,我认为函数应该是正确的但是字符串替换给了我不同的输出。最后一句应该被理解为" Jille,我的名字我们fosker"

但是python shell给了我那个" Jelle,我的neme es fesker":

    H
Replace H with J
e
Replace e with i
l
l
o
Replace o with e
,

m
y

n
a
Replace a with o
m
i
Replace i with u

u
Replace u with a
s

f
a
Replace a with o
s
k
o
Replace o with e
r
Jelle, my neme es fesker

我做错了什么?

3 个答案:

答案 0 :(得分:1)

  

一线解决方案:

print(''.join(char.get(s, s) for s in string))

如果:

string = "Hello, my name is fesker"

char={"a":"o","e":"i","i":"u","o":"e","u":"a","H":"J"}
  

详细解决方案:

     

我对您的代码有一些建议:

请勿在{{1​​}}使用它来替换所有匹配的字符

.replace()
Use dict instead of list there if you want key,value pair.

如果你想修改它,可以在列表中转换字符串,因为字符串是不可变的。

char={"a":"o","e":"i","i":"u","o":"e","u":"a","H":"J"}

以下是您的解决方案,并进行了一些修改:

string=list(string)

输出:

string = "Hello, my name is fesker"

char={"a":"o","e":"i","i":"u","o":"e","u":"a","H":"J"}

string=list(string)

for index,item in enumerate(string):
    for key,value in char.items():
        if item==key:
            string[index]=value

print("".join(string))

答案 1 :(得分:1)

您的问题:

string = string.replace(string[i],chars[x][1])< - 这将替换所选字母的所有实例。因此,在字符串"Hello"中,字母'e'进入此轮次'e' -> 'i' -> 'u' -> 'a' -> 'o' -> 'e',因此它似乎未更改,但实际上已更改了5次。

可能的解决方案:

使用“Hello”示例将“e”替换为“i”:

  • 如果您只想替换n个出现的字母,可以使用.replace()的第3个参数,可以是.replace("e", "i", 1)。注意:这可能是最糟糕的解决方案,但我提到它让您了解.replace()的工作原理。

  • 您可以在循环中替换一个字符。在下面的示例中,当然会将数字1和2替换为ii + 1之类的内容。如果选择此解决方案,请记住,当您遍历字符串或数组时,您将检查每个字母以查看是否需要先替换它。如果需要更换,请使用O(1)查找(使用哈希字典)查找替换字符,然后使用以下示例之一替换。

代码:

string = "{}{}{}".format(string[:1], "i", string[2:])
  • 或者你可以把你的字符串变成一个可变的数组。

代码:

string = list(string)
# or string = [i for i in string]
# ["H", "e", "l", "l", "o"]
string[1] = "i"
# ["H", "i", "l", "l", "o"]
string = "".join(string)
# "Hillo"
  • Ayodhyankit Paul,你绝对应该使用字典存储你的对。此外,这是他解释的循环的1个衬垫解决方案,他解释说:

''.join(char.get(s, s) for s in string)

答案 2 :(得分:0)

string = "Hello, my name is fesker"
chars ={
        "a": "o",
        "e": "i",
        "i": "u",
        "o": "e",
        "u": "a",
        "H":"J",}

res_string = ""

for char in string:
    res = char
    if char in chars.keys():
        res = chars[char]

    res_string += res

print(res_string)

这是另一种解决方案。