【问题标题】:How to test if two strings are anagrams while being case sensitive in Python?如何在Python中区分大小写时测试两个字符串是否是字谜?
【发布时间】:2019-03-16 00:16:35
【问题描述】:

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

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

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

【问题讨论】:

  • 你的代码有各种各样的问题,你应该逐步检查和测试它。请注意,您调用function_one() 时使用了两个完整的字符串,而不是一个字符串和一个字母——尝试以这种方式调用它(直接,这样您就可以检查结果),看看会发生什么。

标签: python anagram


【解决方案1】:

有很多方法可以做到这一点。 我认为您编写这些函数会使事情变得有些复杂。

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

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

    return list1 == list2

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

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

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

【讨论】:

  • 顺便说一下,尽量在变量中使用描述性更强的名称,否则代码很难阅读。
  • 要将字符串转换为小字符列表,您只需调用list(string.lower())。无需使用列表推导。
  • @SvenKrüger 我没有使用列表理解来应用 lower 函数,这是我首先想到的从字符串创建列表。我说这不是很优雅,我做了一个快速的回答:)
【解决方案2】:

您可以通过首先检查两个字符串的长度来整理出不是字谜的字符串对。在第二阶段,您可以比较字符集。这在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 2016-04-07
    • 2021-06-14
    • 2014-09-02
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多