这个函数接受两个对应两个单词的字符串并返回当且仅当一个词是另一个词的变位时为真,也就是说,如果两个词是由相同的字母,忽略大写和小写之间的差异和顺序字符。
>>> eh_anagrama(’caso’, ’SaCo’)
True
>>> eh_anagrama(’caso’, ’casos’)
False
简单,但对数线性方法:
def eh_anagrama(s1, s2):
return sorted(s1.lower()) == sorted(s2.lower())
更好的线性方法,使用collections.Counter
:
from collections import Counter
def eh_anagrama(s1, s2):
return Counter(s1.lower()) == Counter(s2.lower())
这样做的好处可能只适用于非常长的字符串,因为排序是大量c优化的。
如果在dict中使用result和char计数呢?
def anagram(s1, s2):
ana = sorted(s1.lower()) == sorted(s2.lower())
d1 = {}
d2 = {}
for x in set(s1): # Get unique char
d1.update({x: s1.count(x)}) # Count each char
for x in set(s2):
d2.update({x: s2.count(x)})
return {'anagram': ana, s1: d1, s2: d2}
s1 = 'caso'
s2 = 'SaCo'
res1 = anagram(s1, s2)
print(res1)
s1 = 'caso'
s2 = 'casos'
res2 = anagram(s1, s2)
print(res2)
输出:{'anagram': True, 'caso': {'o': 1, 's': 1, 'c': 1, 'a': 1}, 'SaCo': {'o': 1, 'C': 1, 'a': 1, 'S': 1}}
{'anagram': False, 'caso': {'o': 1, 's': 1, 'c': 1, 'a': 1}, 'casos': {'o': 1, 's': 2, 'c': 1, 'a': 1}}
def anagram(s1, s2):
ana = sorted(s1.lower()) == sorted(s2.lower())
d1 = {}
d2 = {}
for x in set(s1): # Get unique char
d1.update({x: s1.count(x)}) # Count each char
for x in set(s2):
d2.update({x: s2.count(x)})
return {'anagram': ana, s1: d1, s2: d2}
s1 = 'caso'
s2 = 'SaCo'
res1 = anagram(s1, s2)
print(res1)
s1 = 'caso'
s2 = 'casos'
res2 = anagram(s1, s2)
print(res2)
{'anagram': True, 'caso': {'o': 1, 's': 1, 'c': 1, 'a': 1}, 'SaCo': {'o': 1, 'C': 1, 'a': 1, 'S': 1}}
{'anagram': False, 'caso': {'o': 1, 's': 1, 'c': 1, 'a': 1}, 'casos': {'o': 1, 's': 2, 'c': 1, 'a': 1}}