如何在Python中区分大小写的同时测试两个字符串是否为字谜?

时间:2018-10-11 02:13:04

标签: python anagram

好的,所以我有两个功能,一个检查一个字符出现在字符串中的次数,另一个应该检查用户输入的两个字符串是否为字谜:

def function_one(s, ch):
    count = 0
    for c in s:
        if c == ch:
            count = count + 1
    return count

def function_two(s, t):
    while len(s) == len(t):
        y = function_one(s, t)
        if y == 0:
            return True
        else:
            return False

现在,如果两个字符串是anagram,那么function_two将返回True,但是如果它们是anagram,但它们的首字母大写,它将返回True,如果根本不是anagram,则不返回任何内容。我该怎么办?

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。 我认为您通过编写这些功能使事情变得有些复杂。

解决这个问题的第一种方法是生成一个包含每个字符串中所有字母的列表,对它们进行排序并比较两个列表:

def check_for_anagrams(string1, string2):
    list1 = list(string1.lower())
    list2 = list(string2.lower())
    list1.sort()
    list2.sort()

    return list1 == list2

这可能不是最优雅的方法,但这是一个快速的解决方案。 lower()函数将字符串变为小写 列表的sort()函数对列表进行排序。

如果两个字符串是字谜,那么这些操作的结果将是两个相等的列表。

编辑:检查可能的重复线程,那里有一些不错的解决方案!

答案 1 :(得分:0)

您可以通过先检查两个字符串的长度来整理成对的无字谜字符串。在第二阶段,您可以比较字符集。这在Python中非常快。在最后一个阶段中,您必须计算集合中单个字符的出现次数,以确保字符串是字谜。

代码

from __future__ import print_function

def isAnagram(s1, s2) :
    s1, s2 = s1.lower(), s2.lower()

    if len(s1) == len(s2) :
        if set(s1) == set(s2) :
            return all([s1.count(c) == s2.count(c) for c in set(s1)])

    return False

string1 = 'Hello'
string2 = 'Hell'    # No anagram of string1
string3 = 'Holle'   # Anagram of string1    

print(isAnagram(string1, string2))
print(isAnagram(string1, string3))

输出

False
True