2

我有一个输入(称为names),该输入分为三个部分(.split),然后第三个(最后一个)元素转换为整数并放入列表中

即例如names = "John Smith 3" 它被分成三个部分"John" "Smith" 3 并放入一个列表中:list1 = ["John", "Smith", 3]

现在我的问题是,如果第三个元素作为字符串输入并且不能转换为整数("John Smith Three"),我该如何显示错误并让用户重新输入(名称)以及如何处理错误如果用户输入"John Jacob Smith 3"(超过三个元素)。

4

4 回答 4

2

我建议您向用户询问两个输入:首先是他/她的名字,然后是幻数。

如果您确实想从单个输入中获取此信息,则可以像这样尝试

while True:
    name_and_num = raw_input("Your input: ")
    parts = name_and_num.split()
    try:
        firstname, lastname, num = parts[0], parts[1], int(parts[2])
        break
    except (IndexError, ValueError):
        print "Invalid input, please try again"

print firstname, lastname, num
于 2013-06-18T09:49:06.837 回答
1

2 解决方法:

这种古老的经典 try catch 方法:

message = 'Please enter ...'
while(True):
    print message
    user_input = raw_input().split()
    if len(user_input) != 3:
        message = 'Incorrect number of arguments please try again'
        continue
    try:
        num_value = int(user_input[2])
    except ValueError:
        message = 'Incorrect int value'
        continue
    break

另一种方法是简单地使用正则表达式,它应该如下所示:

import re    
regex = '^\s*(\w+)\s+(\w+)\s+(\d+)\s*$'
p = re.compile(regex)
print 'Please enter ...'
while(True):
    user_input = raw_input()
    m = p.match(user_input)
    if m:
        value1 = m.group(1)
        value2 = m.group(2)
        int_value = int(m.group(3))
        break
    else:
        print 'Incorrect input format, it should be ...'

并不是说使用此正则表达式,您可以匹配任何具有 3 个元素的字符串,这些元素由任意数量的空格分隔并以 int 值结尾。所以'a b 10'' a b 10 '都是匹配的。

于 2013-06-18T09:46:52.097 回答
0

对于第一部分:一个简单的方法是:

try:
    float(l[2])
except ValueError:
    #error - bad input. user must re enter...

对于第二部分:只需检查拆分形成的列表的长度。

于 2013-06-18T09:41:57.877 回答
0

我更喜欢对所有事情都使用函数:

def processNames(nameString):
  namesList = nameString.split()
  if len(namesList) == 3:
    try:
        namesList[2] = int(namesList[2])
    except:
        print "Third item not an integer"
        return None
  else:
    print "Invalid input"
    return None
  return namesList

假设您有一长串要遍历的名称:

processed = []
for name in longList:
  processed.append(processNames(name))

这将优雅地返回一个项目列表,其中没有填写不正确的条目。

于 2013-06-18T10:11:28.317 回答