我无法使这个anagram功能起作用。目的是为了
获取2个字符串abc
和cba
的函数,将它们转换为列表;
按字母顺序对它们进行排序,比较列表中的元素并打印它们是否是字谜。
我的代码如下......
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))
答案 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()
函数,该函数返回排序后的字符串。
还有两个更普遍的问题:
假设您编写的函数更紧凑:
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显示实际的代码点:
您可以使用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)))