首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >把英语翻译成猪拉丁语

把英语翻译成猪拉丁语
EN

Code Review用户
提问于 2019-09-04 19:32:49
回答 2查看 2.6K关注 0票数 16

这是一个把英语转换成伪语言猪拉丁语的程序.不是猪拉丁文最严格的形式,但它很可能准确地输出猪拉丁文的论点。我是从Github上的想法列表中得到这个想法的。我有什么办法能简明地改进它吗?

代码语言:javascript
复制
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?'))
EN

回答 2

Code Review用户

发布于 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'}
  • 其次,有一种稍微不那么痛苦的方式来生成这些字母。Python的string模块包含一个包含'abcdefghijklmnopqrstuvwxyz'的内置ascii_lowercase。你可以用它和一组元音来限制字母需要硬编码:输入字符串为S元音= {'a','e','i','o','u'}辅音= set(s.ascii_lowercase) -元音#辅音是字母的集合,减去我个人喜欢的元音。

您还可以更改算法以直接使用vowels

只是为了澄清一些事情,

代码语言:javascript
复制
word_copy = word

不创建word的副本。这只会为word字符串创建第二个名称。对于String,这并不重要,因为String是不可变的,但是对于可变的对象,它会咬死您:

代码语言:javascript
复制
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。您给它命名的名称与它包含的字符串一样具有描述性,并且只在一个地方使用过。至少,我会把它重新命名为有意义的东西:

代码语言:javascript
复制
pig_latin_suffix = ['a', 'y']

我还将注意到,这里没有理由使用字符串列表而不是多字符字符串。在这种情况下,它们的行为也是一样的:

代码语言:javascript
复制
" ".join(['a', 'y'])
'a y'

" ".join("ay")
'a y'

字符串是可迭代的,就像列表一样。

我认为pig_latin太大了。它主要做两项工作:把信息分解成文字,并处理单词。我将使处理步骤具有自己的功能:

代码语言:javascript
复制
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可以进一步分解。不过这已经好得多了。直接的好处是,现在您可以测试单个单词,而不必担心代码的其余部分会如何反应:

代码语言:javascript
复制
print(process_word("Can"))  # Prints 'an-Cay'
票数 18
EN

Code Review用户

发布于 2019-09-04 21:57:19

由于这是一个简单的文本转换,正则表达式模块re是您的朋友.

一次处理一个字母是h d。就像@Carcigenicate建议的那样,一次只处理一个词会更简单。

re.sub(pattern, repl, text, ...)函数很有趣,因为它允许您指定用于替换的字符串或函数。作为第一种近似:

代码语言:javascript
复制
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,并分配给firstrest。如果first字母是元音,则以一种方式生成替换文本;如果不是,则生成第二种方式。返回的值用作re.sub(...)调用中的替换值。

如果需要,可以很容易地将transform函数修改为包括-,如果需要,还可以对y进行额外的特殊处理。

票数 12
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/227479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档