是否有pythonic方式来执行以下操作?在一个有2个单词word1
和word2
的世界中,我想要返回相反的单词,最好使用单行
我目前正在做以下工作,但感觉不对:
def get_other_word(word):
if word == word1:
return word2
else:
return word1
我在考虑这样的事情,但它引发了一个错误:
def get_other_word(word):
word_choices = [word1, word2]
return word_choices.remove(word)[0]
答案 0 :(得分:2)
Explicit is better than implicit. Simple is better than complex.
你在第一个代码块中正在做的事情很好。肯定有更聪明的"如何做你所要求的,但它们将是不透明的,难以阅读。
为了进一步说明为什么使用if-then-else
块是最好的方法,这并不需要在解释器上创建任何额外的对象,并且执行速度非常快。
相比之下,制作和调用匿名lambda,或者将所有内容填充到dict或数组中,只是为了将所有内容都放在一行上,实际上会使代码更慢。执行一次,这不会是一个大问题,但如果这个代码每秒被调用数千次,它可能会加起来。
复杂性不是你的朋友,让人们可以阅读的代码与使机器的代码可读同样重要。
答案 1 :(得分:1)
没有任何错误或" unpythonic"关于你的第一个版本,你的第二个版本不起作用的原因是因为word_choices.remove(word)
是一个就地操作(它修改了列表并返回None
):
>>> help([].remove)
Help on built-in function remove:
remove(...)
L.remove(value) -- remove first occurrence of value.
Raises ValueError if the value is not present.
这意味着,它不会返回任何内容,并且您正在执行None[0]
,这不是有效的操作。
您可以修复第二个版本:
def get_other_word(word):
word_choices = [word1, word2]
word_choices.remove(word)
return word_choices[0]
但是,你的第一个带有两个if语句的版本更清晰,如果你要深入了解细节,那就更好了,因为它没有建立一个列表。
答案 2 :(得分:-1)
对于您的第二个代码块:
def get_other_word(word):
word_choices = [word1, word2]
return word_choices.remove(word)[0]
list.remove
就地修改list
并返回None
,因此您必须先保存参考,最好表达如下:
def get_other_word(word):
word_choices = [word1, word2]
word_choices.remove(word)
return word_choices[0]
您还可以使用False
对应0
且True
对应1
的事实,并将list
索引为所需的值,确实恰好是一个单行:
def get_other_word(word):
return [word1, word2][word == word1]
结果:
>>> word1 = 'apple'
>>> word2 = 'banana'
>>> get_other_word('apple')
'banana'
答案 3 :(得分:-2)
您可以使用三元运算符进行单行运算:
return word2 if word == word1 else word1