【问题标题】:How do I make the invalid input appear for only number inputs? And how do I turn the inputs into a list and increase the count for every input?如何使无效输入仅出现在数字输入中?以及如何将输入转换为列表并增加每个输入的计数?
【发布时间】:2021-02-21 15:51:12
【问题描述】:

所以我很困惑如何使无效输入仅出现在数字输入中,如何将输入转换为列表,以及如何增加每个输入的计数?我真的尝试过,但我就是想不通:(。

这是问题:

练习 #17c:列表 #3

  1. 您将从之前的练习中获取相同的想法,该练习要求用户输入多个数字,直到用户输入“完成”。

  2. 在程序的最顶部,您需要将assign (=)empty list ([]) 指向一个变量(While True 循环上方的行)

  3. 程序将不断要求提供姓名列表。

  4. 一旦用户输入“完成”,您的程序就会显示输入了多少名称并显示最终列表。 下面显示了一个示例,说明您应该是什么样子

示例:

输入姓名:布朗夫人

输入姓名:布利斯女士

输入名称:3

这不是名字!再试一次!

输入姓名:肯特先生

输入名称:完成

列表中有 3 个名字 [‘Mrs.布朗”,“女士。幸福”,“先生。肯特’]

这是目前为止的:

namesList = []
while True:
  name = input("Please enter a name, then press enter. When finished type done: \n")
  if name == "done":
    namesList = namesList[:-1]
    print("There are " + str(len(namesList)) + " names in the list " + str(namesList))
    break
  else:
    continue

【问题讨论】:

  • 你永远不会在 namesList 中添加东西!!!???
  • 对不起,我对 python 有点陌生,所以我不确定......

标签: python list input


【解决方案1】:

试试这个:

def hasNumbers(inputString):
  return any(char.isdigit() for char in inputString)

namesList = []
while True:
  name = input("Please enter a name, then press enter. When finished type done: \n")
  if hasNumbers(name):
    print ("That’s not a name! TRY AGAIN!")
    continue
  else:
    if name == "done":
      print("There are", len(namesList), "names in the list", namesList)
      break
    else:
      namesList.append(name)
      continue

【讨论】:

  • 感谢您的帮助!我很感激!
【解决方案2】:

这就是您要添加列表中给定名称的方式

namesList = []
while True:
  name = input("Please enter a name, then press enter. When finished type done: \n")
  if name == "done":
    print("There are " + str(len(namesList)) + " names in the list " + str(namesList))
    break
  else:
    namesList.append(name) #append method adds all the given names in the end of the list
    continue

【讨论】:

  • 非常感谢!我很感激!
【解决方案3】:

关于什么是名称,什么不是名称,您有一个棘手的问题。 (https://www.bbc.com/news/magazine-36107590)

但是,无论如何,向您提供的要求并没有明确定义要接受、拒绝什么。您的示例表明数字将被拒绝。

有几种方法可以实现这一目标。 在 python 中检查特定模式的一种方法是使用正则表达式 (regex)。您可以在此处搜索并确定模式匹配的可靠方法。

在这种情况下,如果唯一的要求是拒绝数字,您还可以利用python在请求将文本转换为整数时会产生错误的事实。您可以利用这一事实来区分字符串中的全数字和非全数字。

下面的这个例子展示了如何使用 try/except 块(也是一个 python 范例)来做到这一点。

ls_test_names = ['Brooke', 'Raj2', '567', '3', '3.141592654']
for t in ls_test_names:
    try:
        name = int(t)
        print('%s looks like digits to me' % t)
    except ValueError as ve:
        print('ValueError : %s' % str(ve))
        print('%s : is not all digits' % t)
        name = t
ValueError : invalid literal for int() with base 10: 'Brooke'
Brooke : is not all digits
ValueError : invalid literal for int() with base 10: 'Raj2'
Raj2 : is not all digits
567 looks like digits to me
3 looks like digits to me
ValueError : invalid literal for int() with base 10: '3.141592654'
3.141592654 : is not all digits

【讨论】:

  • 名字被认为是任何有字母的东西。只是如果输入了一个数字,它是无效的。其他任何内容都是有效的。
  • 也许在如何解释这方面有一些灵活性。但是,您可以看到列表中已有的名字在称呼中有句点……所以这些不是字母。类似地,有些地方的名称(和用户名!)是连字符或带有变音符号的:Zoë Toussaint-Zhang ... 和许多其他可能性。您可以根据您的要求构建健壮的测试用例,通常使用正则表达式。这里还有一些建议:https://stackoverflow.com/questions/19859282/check-if-a-string-contains-a-number
【解决方案4】:

您可以使用 any() 和理解来检查字符串中的数字,以检测不是名称的输入。 .isdigit() 方法告诉您字符串(或字符)是否仅由数字组成。 .isalpha() 方法与字母类似。

names = []
name  = None
while name != "done":
    if name : names.append(name)             # add to list if name present
    name = input("Enter a name: ")           # get a name
    if sum(c.isalpha() for c in name) < 2 \
    or any(c.isdigit() for c in name):       # 2+ letters, no numbers
        name = print("That's not a name! TRY AGAIN!") # sets name to None
print("There are",len(names),"names in the list",names)

顺便说一句,你的代码中的 else: continue 是不需要的,因为之后你没有在循环中做任何事情,if 上的 break 语句也不会去那里。此外,作为一般规则,您应该尽可能避免使用中断/继续。这些通常表明您无法完全控制变量状态并暗示未预见的副作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 2020-12-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2011-08-12
    • 2018-08-15
    • 2021-02-18
    相关资源
    最近更新 更多