我创建了一个python程序,用户在其中输入单词,然后该程序将单词变成一个列表。 然后,用户输入字母,然后程序会告诉您该字母出现了多少次。 现在,我需要添加更多程序以检查其开头输入的单词是回文。 如果是这样,将会有一个好消息,如果不是,那就是错误消息。 不太确定如何开始。 有什么帮助吗?
可能重复的快速和python方式来找出字符串是否是回文
您可以反转字符串并检查它是否等于输入字符串:
def palindrome(s):
return s == s[::-1]
在python中有一个已知的"技巧",使用[::-1]反转单词。虽然不是最有效的:
>>>"racecar" =="racecar"[::-1]
True
>>>"racecars" =="racecars"[::-1]
False
我知道您通常不应该使用[::-1],因为它会创建通常不需要的列表,但是为什么在这种情况下这不是最有效的?
您刚才说了为什么。您可以使用O(1)计算内存和O(n)cpu-time来实现,这样效率更高。
渐近地,您可能是对的,但是我怀疑,对于想要知道其回文的任何大小的单词,它是否比迭代器版本的额外开销大。我对all(a==b for a,b in zip(r,reversed(r)))进行了尝试(有更好的方法吗?),并且[::-1]版本要快得多。
我也认为这是单词长度的问题。我认为大的话将需要更多的内存摆弄,这就是迭代器胜出的地方。如果您使用python 2,请确保您未使用zip创建列表(使用itertools.izip)。
绝对是,在某些时候,迭代器会获胜(尤其是在否定情况下)。我的观点是,在任何涉及实际单词的情况下,它们都不会。 (以及即时通讯使用Python 3)
英语单词,甚至人类语言,都是非常具体的领域。我希望迭代器在所有情况下都能胜诉(即使有微小的差异),所以我有点惊讶。也许两个"指针"(起点,终点)的手动迭代将提供更快的结果,从而避免zip的元组。
好的,我已经查看了您所有的答案。此代码是否合适,甚至是适当的代码呢?
def getPalindrome()
if word == word[::-1] :
print(True)
else :
print(False)
palindrome = getPalindrome()
您的函数会输出布尔值,但应该返回它。
您可以使用简单的条件语句。对于初学者来说,这应该更容易理解。例如:
text ="Rapport"
def palindrome(text)
if text[::-1] == text:
return True
else:
return False
我相信这应该很容易理解。 text [::-1]是最快的方法。一种更慢的方法是使用''.join(reversed(list)),其中列表是您将文本拆分成的列表。您可以通过使用timeit对代码进行计时来验证您要采用哪种方法。
虽然,定时对代码进行切片被认为是不好的基准,所以要对整个代码进行计时。希望我解释得足够好。祝好运!
编辑:您的代码是好的,但是您需要记住,函数将参数作为值,这是您在函数本身中进行的操作。
您的最终代码应如下所示:
文字= StrVar()
def getPalindrome(word):
if word == word[::-1]:
return True
else :
return False
palindrome = getPalindrome(text)
注意,该函数的参数与文本本身不同,我为它分配了一个字符串变量以表明您不需要立即为其提供值。使您的代码优雅。