Python:检查两个单词中的所有字母是否完全相同但顺序不同(amphisbaena)

时间:2017-10-30 16:11:38

标签: python

如果单词的前半部分和后半部分包含完全相同的字母,则单词是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

3 个答案:

答案 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