创建anagram探测器

时间:2015-11-06 16:53:48

标签: python anagram

我无法使这个anagram功能起作用。目的是为了 获取2个字符串abccba的函数,将它们转换为列表; 按字母顺序对它们进行排序,比较列表中的元素并打印它们是否是字谜。

我的代码如下......

def anagram(str1, str2):
    x = str1
    y = str2

    x1 = x.sort()
    y1 = y.sort()

    if (x1) == (y1):
        print("Anagram is True")
    else:
        print("Anagram is False")

str1 = str('abc')
str2 = str('cba')

print(anagram(str1, str2))

2 个答案:

答案 0 :(得分:1)

您的问题是您无法拨打String.sort()。尝试更改:

x1 = x.sort()
y1 = y.sort()

为:

x1 = sorted(x)
y1 = sorted(y)

答案 1 :(得分:0)

具体问题

如果x.sort()是列表,则

x就地工作。这意味着排序方法将更改对象的内部表示形式。它还返回None,这就是它无法按预期工作的原因。

如果x是字符串,则没有.sort()方法,因为字符串是不可变的。

我建议改用sorted()函数,该函数返回排序后的字符串。

更普遍的问题

还有两个更普遍的问题:

  1. 运行时:这是一个O(log(n)* n)解决方案
  2. Unicode 修饰符和复合字形
  3. 打印:您打印值,但应返回结果。您将如何测试代码?

Unicode修饰符

假设您编写的函数更紧凑:

def is_anagram(a: str, b: str) -> bool:
    return sorted(a) == sorted(b)

这对于正常字符正常,但对复合字形则无效。例如,可以将thumbsup / thumbsdown表情符号修改为具有不同的颜色。颜色的变化实际上是第二个unicode“字符”,它给出肤色。修饰符和上一个字符属于同一类,但是sorted仅看代码点。结果是这样:

>>> is_anagram("???", "???")
True  # <-- This should be False!

Sublime Text显示实际的代码点:

enter image description here

您可以使用grapheme软件包轻松解决此问题:

from grapheme import graphemes
def is_anagram(a: str, b: str) -> bool:
    return sorted(graphemes(a)) == sorted(graphemes(b))

运行时

如果不进行排序,则可以获取O(n)运行时,而是计算字符数:

from collections import Counter
from grapheme import grahemes

def is_anagram(a: str, b: str) -> bool:
    return not (Counter(grapheme(a)) - Counter(grapheme(b)))