如果单词的前半部分和后半部分包含完全相同的字母,则单词是amphisbaena,但不一定是相同的顺序。如果单词的字母数为奇数,则在此定义中忽略中间字母(或者它属于两半)。
我的代码适用于大多数情况,例如:'eisegesis' - > eise esis 我的代码不检查所有字母是否只在另一个单词中出现一次,而反之亦然。字母“s”在单词的另一部分(一半)中不会出现两次。如何调整代码?
def amphisbaena(word):
"""
>>> amphisbaena('RESTAURATEURS')
True
>>> amphisbaena('eisegesis')
False
>>> amphisbaena('recherche')
True
"""
j = int(len(word) / 2)
count = 0
tel = 0
firstpart, secondpart = word[:j], word[-j:]
for i in firstpart.lower():
if i in secondpart.lower():
count +=1
for i in secondpart.lower():
if i in firstpart.lower():
tel +=1
if 2 * j == count + tel:
return True
else:
return False
答案 0 :(得分:3)
您需要分别对两半的字母进行计数,并比较每个字母的计数。最简单的方法是使用collections.Counter
:
def amphisbaena(word):
from collections import Counter
w = word.lower()
half = len(word) // 2
return half == 0 or Counter(word[:half]) == Counter(word[-half:])
虽然这不仅仅是比较排序的一半那么简单,但它是O(N)
而不是O(N * log_N)
。
答案 1 :(得分:3)
我会做这样的事情:
j = int(len(word) / 2)
firstpart, secondpart = word[:j], word[-j:]
return sorted(firstpart) == sorted(secondpart)
答案 2 :(得分:0)
你可以在一行中使用lambda函数:
string_1='recherche'
half=int(len(string_1)/2)
amphisbaena=lambda x: True if sorted(x[:half])==sorted(x[-half:]) else False
print(amphisbaena(string_1))
输出:
True
使用其他字符串:
string_1='eisegesis'
half=int(len(string_1)/2)
amphisbaena=lambda x: True if sorted(x[:half])==sorted(x[-half:]) else False
print(amphisbaena(string_1))
输出:
False