基本字谜VS更高级

2024-10-02 10:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在学习一个“列表”单元,在其中一个练习中,我们需要创建一个anagram(对于那些不知道的人;两个单词是一个anagram,如果你可以重新排列其中一个字母来拼写另一个)。你知道吗

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

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,尽管我们应该能够用'dyog'构建单词'god'。也许这个游戏/问题不叫字谜,但我一直在努力想办法解决。你知道吗

从技术上讲,我的解决方案是:
1-遍历b的每个元素。
2-我会检查a中是否存在该元素。
3-如果他们都这样做,那么我们就可以从b中创建a。
否则,我们不能

我只是没办法让它发挥作用。我不知道如何使用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

谢谢:)


Tags: falsetrue元素returnisdef解决方案单词
3条回答
def is_anagram(a, b):
    test = sorted(a) == sorted(b)
    testset = b in a
    testset1 = a in b
    if testset == True:
        return True
    if testset1 == True:
        return True
    else:
        return False

不比另一种解决方案好。但如果你喜欢冗长的代码,这是我的。你知道吗

如果您需要检查a单词是否可以从b创建,您可以这样做

def is_anagram(a,b):
    b_list = list(b)
    for i_a in a:
        if i_a in b_list:
            b_list.remove(i_a)
        else:
            return False
    return True

更新(解释)

b_list = list(b)生成liststr对象(字符)。你知道吗

>>> b = 'asdfqwer'
>>> b_list = list(b)
>>> b_list
['a', 's', 'd', 'f', 'q', 'w', 'e', 'r']

答案基本上是这样的:我们检查a中列在b_list中的每个字符,当出现时,我们从b_list中删除该字符(我们这样做是为了消除用输入'good''god'返回True的可能性)。因此,如果在b_list的其余部分中没有出现另一个a字符,那么它就不是高级的anagram。你知道吗

由于其他答案在撰写本文时不支持颠倒顺序:

为了方便起见,包含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)

相关问题 更多 >

    热门问题