我目前正在通过“列表”单元进行操作,在其中一个练习中,我们需要创建一个字谜(对于不认识的人;如果您可以重新排列一个字母来拼写其他)。
想到的更简单的解决方案是:
def is_anagram(a, b):
return sorted(a) == sorted(b)
print is_anagram('god', 'dog')
它有效,但并不能真正令我满意。例如,如果我们处于这种情况下:
def is_anagram(a, b):
return sorted(a) == sorted(b)
print is_anagram('god', 'dyog') #extra letter 'd' in second argument
>>> False
Return是False,尽管我们应该能够在
'god'
中构建单词'dyog'
。也许这个游戏/问题没有被称为“ anagram”,但是我一直在试图找出答案。从技术上讲,我的解决方案是:
1-遍历b的每个元素。
2-像我一样,我检查a中是否存在该元素。
3-如果他们都做;然后我们可以从b中创建a。
4-否则,我们不能。
我似乎无法正常工作。作记录,我不知道如何使用
lambda
一些测试:
print is_anagram('god', 'ddog') #should return True
print is_anagram('god', '9d8s0og') #should return True
print is_anagram('god', '_@10d_o g') #should return True
谢谢 :)
最佳答案
由于其他答案在撰写本文时不支持反转顺序:
为了方便起见包含type hints,因为为什么不呢?
# Just strip hints out if you're in Python < 3.5.
def is_anagram(a: str, b: str) -> bool:
long, short = (a, b) if len(a) > len(b) else (b, a)
cut = [x for x in long if x in short]
return sorted(cut) == sorted(short)
如果将来您确实学会使用
lambda
,则等效项是:# Again, strip hints out if you're in Python < 3.5.
def is_anagram(a: str, b: str) -> bool:
long, short = (a, b) if len(a) > len(b) else (b, a)
# Parentheses around lambda are not necessary, but may help readability
cut = filter((lambda x: x in short), long)
return sorted(cut) == sorted(short)
关于python - Basic Anagram VS更高级的一门,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39797552/