我目前正在通过“列表”单元进行操作,在其中一个练习中,我们需要创建一个字谜(对于不认识的人;如果您可以重新排列一个字母来拼写其他)。

想到的更简单的解决方案是:

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/

10-12 23:09