如果代码检查所有情况,我该怎么做?

时间:2017-10-03 23:03:37

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

#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')

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

示例:

enter image description here

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

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

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

2 个答案:

答案 0 :(得分: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'

算法改进

因为我们知道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'

这比原始方法快 (大约快9倍):

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

答案 1 :(得分:0)

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

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

return(d+' is an isogram')