我目前正在学习“列表”单元,在其中一个练习中,我们需要创建一个字谜词(对于那些不知道的人;如果您可以重新排列两个单词,那么它们就是一个字谜词)一个字母拼写另一个字母)。
我想到的更简单的解决方案是:
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
返回值为 False,尽管我们应该能够从 'dyog'
构建单词 'god'
。也许这个游戏/问题不叫字谜,但无论如何我一直在试图弄清楚它。
从技术上讲,我的解决方案是:
1- 迭代 b 的每个元素。
2-正如我所做的那样,我检查该元素是否存在于 a.
3- 如果他们都这样做;然后我们可以从 b 中创建一个。
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 - 基本 Anagram VS 更高级的 Anagram,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39797552/