我已经问了一个完全相同的问题,但我得到的答案仍然有效,它在函数中使用了.translate方法,但是我想使用“for loops”来获取我正在寻找的输出。以下是我刚才提出的问题的链接:How can I replace multiple characters in a string using python?
我在查找如何使用for循环替换字符串中的多个字符时遇到了一些麻烦。我正在尝试编写一个名为replace(string)的函数,它接受一个输入,并用另一个字母替换输入中的某些字母。
假设我有字符串“WXYZ”,我想用Y替换所有W,用Z替换X,用W替换Z,用X替换Z.无论输入是什么,我都希望它进行替换。所以如果我也做像替换(“WWZXWWXYYZWYYY”)之类的东西,它应该替换我上面所说的字母。
到目前为止,这是我用for循环完成的:
def replace(string):
for letters in string:
string = string.replace("W","Y").replace("X","Z").replace("Y","W").replace("Z","X")
print(string)
但是当我使用replace(“WXYZ”)
运行它时我得到代码的输出为:WXWX
而不是将YZWX作为输出。我也想使用python的内置函数。
我怎样才能做到这一点?
答案 0 :(得分:4)
问题是你的替换中有交集。 Python从左到右调用方法。这就是以下代码的工作原理:
In [6]: 'ax'.replace('a', 'b').replace('b', 'g')
Out[6]: 'gx'
为了解决这个问题,您应该立即更换字符。解决这个问题的一种方法是使用正则表达式甚至更好(如果你只想更换字符)str.translate
方法:
In [16]: d = {"W": "Y", "X": "Z", "Y": "W", "Z": "X"}
In [17]: "WXYZ".translate(str.maketrans(d))
Out[17]: 'YZWX'
答案 1 :(得分:1)
问题在于,第三个replace
也替换了新的Y
s(最初为W
s)。
一种方法是使用RegEx,如here中所示。
我能想到的另一种方法是换成临时值。但为此你需要找到永远不会出现在原始字符串中的临时值。
例如,如果您知道原始字符串只是大写字母,则可以使用string.replace("W","y").replace("X","z").replace("Y","w").replace("Z","x")
,然后将所有小写字母替换回大写字母而不必担心重新放置字母。
如果您不能确定它只是大写,请找到另一组永远不会出现在字符串上的字符,或者使用RegEx。
答案 2 :(得分:1)
这是您的问题的解决方案。我希望这可以帮助你:)
def replacer(string): #define the function with a parameter (which will be whatever string you want)
newlist = [] #create a new list which will be the output
strlist = list(string) #create a list of each character in the input string
for item in strlist: #iterate through the items in the list of string characters
if item == 'W': # this line and the next 7 lines check what the letter is and writes the letter you want to the new list
newlist.append('Y')
elif item == 'X':
newlist.append('Z')
elif item == 'Y':
newlist.append('W')
elif item == 'Z':
newlist.append('X')
return ''.join(newlist) #output the new list as a string
replacer('WWZXWWXYYZWYYY') #call the function with the string as a parameter