【问题标题】:How can I make if code check all cases?如果代码检查所有情况,我该如何做?
【发布时间】:2017-10-03 23:03:37
【问题描述】:
#Checking if a word is an isogram
from collections import Counter
def count_isogram(words, index):
    a=Counter(words[int(index)])
    d=words[int(index)]
    for (b,c) in a.items():
        if c >= 2:
            print(b,c)
            return(d+' is not an isogram')
        else:
            print(b,c)
            return(d+' is an isogram')

嗨,这是我上面的代码。我正在尝试制作一个非常基本的等值线检查器(等值线是一个没有任何重复字母(狗、猫、鸟等)的单词。我的代码大部分都在工作,但是当我到达我的if 语句,它检查每个单词的第一个字母以确定要使用哪个返回短语。如何让我的代码检查每个字母?例如下面的图片链接演示了这个问题(我没有足够高的代表来发布图片):

例子:

您可以看到第一个场景中的单词:'silly'(索引为 1)正在通过函数运行,但由于只有 1 个 S,它返回该单词是等值图,而实际上不是。当运行单词'dude'(索引为1)时,因为第一个字母在单词中出现不止一次,所以它运行正确的返回,但这只是因为检查的第一个字母是重复的。

我尝试过运行 c.all()c.any() 和其他一些运算符,但它不起作用,因为 c 是一个只有 1 个值的整数。

我可以更改/添加什么以使代码在运行返回之前检查所有可能的字母?

【问题讨论】:

    标签: python loops for-loop if-statement repeat


    【解决方案1】:

    解决方案

    您的问题的解决方案是返回程序的最终结果,您完成每个字母的循环之后。

    对于每个字母,检查其计数是否大于或等于2。如果是,请立即返回相应的消息 (return word + ' is not an isogram')。但是,如果你到达循环的末尾,你就知道这个词确实是一个等值线,所以你可以返回另一条消息 (word + ' is an isogram')

    from collections import Counter
    
    def is_isogram(words, index):
        el = words[index]
        letter_occurences = Counter(el)
        for word, count in letter_occurences.items():
            print(word, count)
            if count >= 2:
                return word + ' is not an isogram'
        return word + ' is an isogram'
    

    算法改进

    因为我们知道等值线是

    任何没有重复字母的单词

    我们可以使用set 从字符串中删除任何可能的重复字母。然后我们可以将集合的长度与字符串的原始长度进行比较。如果长度相等,则没有删除任何字母,并且该单词是等值线。如果它们不相等,我们就知道这个词不是等值线:

    def is_isogram(words, index):
        word = words[index]
        if len(set(word)) == len(word):
            return word + ' is an isogram'
        return word + ' is not an isogram'
    

    这比原来的方法快很多(准确地说大约快九倍):

    ------------------------------------
    | Original method | 6.47415304184  |
    ------------------------------------
    | Above method    | 0.669512987137 |
    ------------------------------------
    

    【讨论】:

    • 哇,非常感谢。我才刚刚开始,所以我仍在尝试完成简单的编码练习,但感谢您提供第二个代码。这是进行此测试的一种非常有趣的思考方式!特别是因为它简化了很多事情(从编码的角度和处理的角度来看)。我很好奇你如何检查某个脚本的效率或速度?
    • @user8620463 很高兴我能帮上忙 :-) 编码愉快!
    【解决方案2】:

    您的ifelse 都返回,这意味着您将始终在循环的第一次迭代时返回。相反,只有在发现单词不是等值线时,循环才应返回。只有当循环终止而没有得出这样的结论时,你才应该返回这个词是一个等值线:

    for (b,c) in a.items():
        if c >= 2:
            return(d+' is not an isogram')
    
    return(d+' is an isogram')
    

    【讨论】:

    • 哦,天哪,我错过了一个如此简单的修复。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 2014-08-21
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2022-01-24
    • 2023-03-20
    相关资源
    最近更新 更多