所以我只是python中的一个菜鸟,我正在做这个练习:
“编写一个函数translate(),将文本转换为”rövarspråket“(瑞典语为”强盗的语言“)。也就是说,每个辅音加倍并在其间放置”o“。例如,翻译( “这很有趣”)应该返回字符串“tothohisos isos fofunon”。“
我能够在这里做的是我的代码:
def translate (var1):
vaw = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']
var1 = list(var1)
for string in var1:
if string == string in vaw:
var1[var1.index(string)] = string + 'o' + string
print ''.join(var1)
我想知道这是否正确,或者是否有另一种方法可以用更少的代码来完成它?
答案 0 :(得分:9)
def translate(s):
consonants = 'bcdfghjklmnpqrstvwxz'
return ''.join(l + 'o' + l if l in consonants else l for l in s)
print(translate("this is fun"))
答案 1 :(得分:5)
正则表达式是一个很好的解决方案
>>> import re
>>> print re.sub(r"([bcdfghjklmnpqrstvwxyz])",r"\1o\1","this is fun")
tothohisos isos fofunon
答案 2 :(得分:1)
首先,您不需要这样做:
vaw = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z']
...获取一系列字符。字符串已经是一系列字符。 (对于var1
也是如此,但在那里,你的代码需要一个可变字符序列,你可以用更长的字符串替换任何字符,所以你做< / em>需要一个list
。)
此外,您的代码实际上无法正常工作,因为string == string in vaw
与True in vaw
相同,但始终为false。我想你的意思是if string in vaw
。虽然我们在这里,但我不会调用变量string
,因为这是内置模块的名称。
你可以通过在标准Python风格(PEP8)所说的地方不添加额外的空格来节省一些按键。 :)
所以:
def translate(var1):
vaw = 'bcdfghjklmnpqrstvwxz'
var1 = list(var1)
for s in var1:
if s in vaw:
var1[var1.index(s)] = s + 'o' + s
print ''.join(var1)
接下来,如果你想要var1
中每个元素的索引,你不想丢弃它,然后用index
再次找到它。除了更多的代码和更慢的代码之外,它还会为出现不止一次的任何元素提供错误的答案。所以:
def translate(var1):
vaw = 'bcdfghjklmnpqrstvwxz'
var1 = list(var1)
for i, s in enumerate(var1):
if s in vaw:
var1[i] = s + 'o' + s
print ''.join(var1)
如果你想要就地改变var
列表,这就是你可以去的地方。您可以将其更改为var1[i+1:i+1] = 'o' + s
,在现有元素之后插入新元素,但是您必须迭代var1
的副本(在迭代时不能更改任何形状)它),你必须跟踪你的索引如何移动,等等。
构建新结构通常要比修改旧结构简单得多。这就是列表推导,生成器表达式,map
,filter
等等。对于原始列表的每个元素s
,如果它位于s + 'o' + s
,则需要vaw
,否则只需s
,对吧?您可以将其转换为Python:
def translate (var1):
vaw = 'bcdfghjklmnpqrstvwxz'
new_var1 = (s + 'o' + s if s in vaw else s for s in var1)
return ''.join(new_var1)