我试图操纵一个字符串。
从字符串中提取所有元音后,我想要替换所有的' v'用' b'以及所有''与' v'来自相同的字符串(例如,#34; accveioub"将首先成为ccvb,然后是ccbv)。
我在交换字符时遇到问题。我最终得到了ccvv,我想我会根据这段代码得到它。我正在考虑迭代字符串并使用if语句基本上停留在索引i .equals" v"然后将其替换为" b"和另一个声明说" b"用" v"替换它然后将这些人物一起追加或加入?
这是我的代码
def Problem4():
volString = {"a", "e", "i", "o", "u", "A", "E", "I", "O", "U"}
s = "accveioub"
chars = []
index = 0
#Removes all the vowels with the for loop
for i in s:
if i not in volString:
chars.append(i)
s2 = "".join(chars)
print(s2)
print(s2.replace("v", "b"))
print(s2.replace("b", "v"))
>>> Problem4()
ccvb
ccbb
ccvv
>>>
答案 0 :(得分:3)
你实际上已经中途完成了,唯一需要注意的是当你想要“交换”string
时,你必须创建“临时”string
而不是替换是直。
你做的是这个:
ccvb
ccbb #cannot distinguish between what was changed to b and the original b
ccvv #thus both are changed together
考虑使用string
中不存在的字符作为第一个替换字符。更确切地说,我现在首先使用b
更改所有1
:
s2 = s2.replace("b","1")
s2 = s2.replace("v","b")
s2 = s2.replace("1","v")
然后你会得到:
ccvb #original
ccv1 #replace b with 1
ccb1 #replace v with b
ccbv #replace 1 with v
这里最重要的一点是使用临时string
答案 1 :(得分:3)
Python的理解和生成器表达非常强大
您可以在执行join()
:
>>> volString = {"a", "e", "i", "o", "u", "A", "E", "I", "O", "U"}
>>> s = 'accveioub'
>>> ''.join(c for c in s if c not in volString)
'ccvb'
事实上你也在join()
进行交换,但这可能有点过于冗长:
>>> ''.join('v' if c == 'b' else 'b' if c == 'v' else c for c in s if c not in volString)
'ccbv'
您可以将交换代码提取到映射字典中(dict.get(k, v)
如果v
不在字典中则返回k
):
>>> vbmap = {'b': 'v', 'v': 'b'}
>>> ''.join(vbmap.get(c, c) for c in s if c not in volString)
'ccbv'
这些解决方案的优点是避免了所有中间字符串创建。
答案 2 :(得分:-1)
你应该使用中间替换来在python中获得正确的结果:
s2.replace('b',' ')
s2.replace('v','b')
s2.replace(' ','v')
换句话说,步骤如下:
祝你好运!