【问题标题】:How to get "valid"/"invalid" output from a list of letters that will constitute output?如何从构成输出的字母列表中获取“有效”/“无效”输出?
【发布时间】:2017-09-29 18:21:43
【问题描述】:
fly= input("give me an input")
list=["f","r","u","i","t"]

letter=0
for i in list:
    if i==(fly(letter)):
        print("valid")
        letter +=1
    else:
        print("invalid")

输出应根据单词包含的字母显示单词是否有效。

我是 Python 的新手。我想知道当输入只能由字母“f”、“r”、“u”、“i”和“t”组成时输出是否有效,如果输入中写有另一个字母结果应该是无效的。因此单词fruit的任何位移都是有效的,但是如果输入是“tfruh”,那么由于不需要的字母“h”,它应该显示无效。然而,并非所有字母都必须包含在内,因此输入可以是“fru”并且应该是有效的。另外如何找到无效字符的位置并打印出来?

【问题讨论】:

  • 请在您的问题中添加实际代码而不是图像。它将帮助其他 SO 社区成员阅读和运行该程序,他们将能够更有效地帮助您,而不会浪费太多时间
  • 非常感谢这是我的第一篇文章,下次我会更加小心! :)
  • fly(letter) 没有多大意义。如果fly 是一个函数,那么它将调用该函数,并将letter 作为其参数传递给它。但在您的代码中,flyinput 函数返回的字符串的名称。顺便说一句,您不应该使用 list 作为变量名,因为这会影响内置的 list 类型。

标签: python


【解决方案1】:

您可以使用以下代码:

fly= input("give me an input ")
mylist=["f","r","u","i","t"]

letter=0
for i in fly:
    if i in mylist:
        print("valid")
        letter +=1
    else:
        print("invalid")

对于输入中的每个字符,检查您的允许字符列表是否包含它。

【讨论】:

    【解决方案2】:

    测试一个字符是否有效的有效方法是使用一组有效的字母。并且我们可以使用内置的enumerate函数同时获取单词中的字符及其位置。

    allowed = set('fruit')
    
    words = ('fitur', 'iursfgt', 'ffrruuiitt', 'FRUIT')
    for word in words:
        print(word)
        valid = True
        for i, c in enumerate(word):
            if c not in allowed:
                print('Bad char', c, 'at position', i)
                valid = False
        if valid:
            print(word, 'is valid\n') 
        else:
            print(word, 'is invalid\n') 
    

    输出

    fitur
    fitur is valid
    
    iursfgt
    Bad char s at position 3
    Bad char g at position 5
    iursfgt is invalid
    
    ffrruuiitt
    ffrruuiitt is valid
    
    FRUIT
    Bad char F at position 0
    Bad char R at position 1
    Bad char U at position 2
    Bad char I at position 3
    Bad char T at position 4
    FRUIT is invalid
    

    如果不允许您使用enumerate,您可以使用间接迭代,通过循环range,并使用它来索引单词。而且你不需要需要为允许的字母使用一个集合,你可以只使用一个字符串,或者一个列表。

    allowed = 'fruit'
    words = ('fitur', 'iursfgt', 'ffrruuiitt', 'FRUIT')
    for word in words:
        print(word)
        valid = True
        for i in range(len(word)):
            c = word[i]
            if c not in allowed:
                print('Bad char', c, 'at position', i)
                valid = False
        if valid:
            print(word, 'is valid\n') 
        else:
            print(word, 'is invalid\n') 
    

    此代码产生与早期版本相同的输出。


    只是为了好玩,这是一个几乎无法阅读的版本。 ;)

    allowed = set('fruit')
    words = ('fitur', 'iursfgt', 'ffrruuiitt', 'FRUIT')
    for word in words:
        a = [word]
        a.extend(f'Bad char {c} at position {i}' for i, c in enumerate(word)
            if c not in allowed)
        a.append(f"{word} is {('in', '')[not a]}valid\n")
        print('\n'.join(a))
    

    这绝对是不是编码的好方法!

    【讨论】:

    • 不使用 enumerate 函数,只使用 for 循环和 if 语句,是否可以找到无效字母的位置?因此输出应如下所示:“X(位置 2)不是有效字母。”顺便说一句,非常感谢您的解决方案,肯定也会尝试这个!
    • @Cabbage55 是的,没有enumerate 也可以,但替代方案不那么干净。 enumerate 是一个非常重要的内置函数,所以学习如何使用它是一个好主意。当然,如果这是一个家庭作业并且不允许您使用enumerate,那就另当别论了。 ;)
    • 例如,您可以使用for i in range(len(word): c = word[i] 等代替enumerate。但是使用for 循环和range 这样的循环遍历字符串在Python 中被认为是不好的风格.它的效率较低,并且往往会使代码更加混乱和难以阅读。
    【解决方案3】:

    您可以创建如下所示的函数来检查您的单词是否为有效单词(单词的每个字符都在您的列表中),并将无效字符索引的代码分解为(作为注释添加到代码的解释):

    def check_validity(word):
        my_list = ["f", "r", "u", "i", "t"]
        #  ^ don't use `list` as variable name as it is an in-built data type
    
        # `enumerate` allows to iterate the list returning the index as well  
        for i, c in enumerate(word):
            # check character of your string is not in your list
            if c not in my_list:
                print("invalid character '{}'' at index: {}".format(c, i))
                break   # break loop if condition satisfies
        else:
            print("Valid word: {}".format(word))
    

    样本运行

    >>> check_validity("fruit")
    Valid word: fruit
    >>> check_validity("itf")
    Valid word: itf
    >>> check_validity("frugit")
    invalid character 'g'' at index: 3
    

    注意:我将字符串传递给这些函数,但您在此处传递input() 返回的值(在您的情况下为fly 变量)。

    【讨论】:

    • 我已经在你的函数上工作了一段时间,并试图向它添加一些特性但失败了:(例如函数给出了第一个不属于列表的错误字母,我'我希望它遍历每个字母说“位置 4 的‘h’无效”并且应该对每个下一个无效字母做同样的事情所以我设置 i=0 然后添加 + 1 但这只会增加第一个无效字母的值. 能不能给我指点一下如何实现这样的功能?
    • @Cabbage55 那么你的意思是你的函数应该打印所有无效字符吗?如果是,那么您只需从我共享的函数中删除 break 语句
    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多