这是一个把英语转换成伪语言猪拉丁语的程序.不是猪拉丁文最严格的形式,但它很可能准确地输出猪拉丁文的论点。我是从Github上的想法列表中得到这个想法的。我有什么办法能简明地改进它吗?
def pig_latin(message):
consonants = ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y',
'z']
new_message = ''
for word in message.split():
ay = ['a', 'y']
listed_word = list(word)
word_copy = word
moved_consonants = ''
for letter in listed_word.copy():
if letter.lower() == 'y':
if letter in word_copy[0]:
moved_consonants += letter
listed_word.remove(letter)
else:
break
elif letter.lower() in consonants:
moved_consonants += letter
listed_word.remove(letter)
else:
break
listed_word.append('-' + moved_consonants + ''.join(ay))
new_message += ''.join(listed_word) + ' '
return new_message
print(pig_latin('Can you read pig latin?'))发布于 2019-09-04 20:45:59
首先,在顶部列出所有辅音。这里有两件事可以改进:
[]替换为{}即可。辅音= {'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z'}string模块包含一个包含'abcdefghijklmnopqrstuvwxyz'的内置ascii_lowercase。你可以用它和一组元音来限制字母需要硬编码:输入字符串为S元音= {'a','e','i','o','u'}辅音= set(s.ascii_lowercase) -元音#辅音是字母的集合,减去我个人喜欢的元音。您还可以更改算法以直接使用vowels。
只是为了澄清一些事情,
word_copy = word不创建word的副本。这只会为word字符串创建第二个名称。对于String,这并不重要,因为String是不可变的,但是对于可变的对象,它会咬死您:
my_list = []
list_copy = my_list # Does not actually create a copy!
my_list.append(1)
print(my_list, list_copy) # prints [1] [1]请注意这两个列表是如何添加到的。这是因为实际上只有一个列表。这两个名字指的是同一个列表。
为了清晰起见,我会重新命名它,以说明它的目的是什么。不过,我完全看不出对word_copy的需求!如果它被用作循环或其他什么的累加器,这将是有意义的,但是它唯一使用的时间是在word_copy[0],而且由于您从不重新分配word,所以您可以只执行word[0]。我只想摆脱word_copy。
按照同样的思路,我会重新考虑ay。您给它命名的名称与它包含的字符串一样具有描述性,并且只在一个地方使用过。至少,我会把它重新命名为有意义的东西:
pig_latin_suffix = ['a', 'y']我还将注意到,这里没有理由使用字符串列表而不是多字符字符串。在这种情况下,它们的行为也是一样的:
" ".join(['a', 'y'])
'a y'
" ".join("ay")
'a y'字符串是可迭代的,就像列表一样。
我认为pig_latin太大了。它主要做两项工作:把信息分解成文字,并处理单词。我将使处理步骤具有自己的功能:
def process_word(word):
ay = ['a', 'y']
listed_word = list(word)
word_copy = word
moved_consonants = ''
for letter in listed_word.copy():
if letter.lower() == 'y':
if letter in word_copy[0]:
moved_consonants += letter
listed_word.remove(letter)
else:
break
elif letter.lower() in consonants:
moved_consonants += letter
listed_word.remove(letter)
else:
break
listed_word.append('-' + moved_consonants + ''.join(ay))
return ''.join(listed_word)
def pig_latin(message):
new_message = ''
for word in message.split():
processed_word = process_word(word)
new_message += processed_word + ' '
return new_message可以说,process_word可以进一步分解。不过这已经好得多了。直接的好处是,现在您可以测试单个单词,而不必担心代码的其余部分会如何反应:
print(process_word("Can")) # Prints 'an-Cay'发布于 2019-09-04 21:57:19
由于这是一个简单的文本转换,正则表达式模块re是您的朋友.
一次处理一个字母是h d。就像@Carcigenicate建议的那样,一次只处理一个词会更简单。
re.sub(pattern, repl, text, ...)函数很有趣,因为它允许您指定用于替换的字符串或函数。作为第一种近似:
import re
def pig_latin(text):
def transform(match):
first, rest = match.group(1, 2)
if first.lower() in "aeiou":
return first + rest + 'way'
else:
return rest + first + 'ay'
return re.sub(r'(\w)(\w*)', transform, text)
print(pig_latin("Can you read pig latin?"))anCay‘?
在这里,regex用两个捕获组提取整个单词。第一个组只是第一个字母\w,第二个组是单词\w*中的其余字母(如果有的话)。match传递给transform函数,从中提取组#1和#2,并分配给first和rest。如果first字母是元音,则以一种方式生成替换文本;如果不是,则生成第二种方式。返回的值用作re.sub(...)调用中的替换值。
如果需要,可以很容易地将transform函数修改为包括-,如果需要,还可以对y进行额外的特殊处理。
https://codereview.stackexchange.com/questions/227479
复制相似问题