我和我的一个朋友正在研究如何用 Python 从头开始压缩 Pig Latin 翻译器。这是我的代码:
output = []
outputWord = ""
def translate(inp):
global output
words = inp.split()
for i in range(len(words)):
outputWord = ""
curWord = words[i]
if curWord[0] == "a" or curWord[0] == "o" or curWord[0] == "e" or curWord[0] == "u" or curWord[0] == "i":
outputWord = curWord + "way"
elif curWord[1] == "a" or curWord[1] == "o" or curWord[1] == "e" or curWord[1] == "u" or curWord[1] == "i":
for count in range(len(curWord)-1):
outputWord = outputWord + curWord[count+1]
outputWord = outputWord + curWord[0] + "ay"
else:
for count in range(len(curWord)-2):
outputWord = outputWord + curWord[count+2]
outputWord = outputWord + curWord[0] + curWord[1] + "ay"
output.append(outputWord)
translate(raw_input(""))
print(' '.join(output))
我们不考虑大写或标点符号。到目前为止,我已经写到了 21 行,而他仍在修复他的代码。
我看到人们将 if/elif/else 语句压缩到一行,但我不确定是否是这样。我会用这个。
有人对压缩有任何其他想法吗?
注意:请不要为我压缩我的代码。一切都是我们自己做的,但我们可以寻求帮助。如果您能找到一种方法,我可以压缩我的代码,将我引导到解释如何操作的地方,或者在不考虑我的具体情况的情况下向我解释它,只是类似的东西。
或者如果我有错误/改进,您可以尝试用同样的方式解释它。
你的代码写得很好,而且组织得很好,这比压缩代码更重要。但,由于你的目标是尽可能缩短代码,下面提供了一些建议:
- 使用成员资格测试以获得简洁性:
你可以使用
if curWord[0] in "aeiou":
代替单独列出所有元音。这将检查第一个字母是否包含在元音字符串中,这更简洁。
- 使用切片和字符串连接:
你可以使用 Python 的切片功能来代替循环追加字母。例如,
curWord[1:]
将给你从第二个字母到字符串末尾的所有字母。
-
将
translate()
函数的输出内联:
你可以直接在
print
语句中调用
translate()
函数,而不是将结果存储在
output
列表中,然后再连接并打印。
以下是你的代码的压缩版本,其中包含了解释:
def translate(inp):
words = inp.split()
return ' '.join(
word + "way" if word[0] in "aeiou" else \
word[1:] + word[0] + "ay" if word[1] in "aeiou" else \
word[2:] + word[0:2] + "ay"
for word in words
)
print(translate(raw_input("")))
说明:
- 此代码使用列表推导在一个表达式中执行翻译,使其比循环方法更紧凑。
-
它使用条件表达式(
a if condition else b
)来处理不同的元音位置,从而实现一行中实现if/else
逻辑。 -
word[0] in "aeiou"
检查第一个字母是否是元音。 -
切片如
word[1:]
、word[2:]
和word[0:2]
用于提取单词的不同部分,从而实现简洁的 Pig Latin 转换。
请记住,虽然此压缩版本更短,但它可能不像你的原始代码那样具有可读性。在软件开发中,可读性和可维护性通常比简洁性更重要。
标签:python From: 78781143