检查输入是数字还是句点

时间:2013-10-16 00:48:04

标签: python

我正在尝试接受用逗号分隔的用户输入,并根据输入的数据创建一个列表。例如,用户输入1,2,3,4,5.6,7并构建列表[1,2,3,4,5.6,7]。我还想确保不会有任何字母,但允许空格,单点和数字。例如,如果用户输入1,2,3,4.4.3,a,则应返回空白[]列表。

到目前为止,我已经创建了

def is_numeric(s):
    if s == :
        print("True")
    else:
        print("False")

def main():
    s = input("Enter a set of numbers (integers or floats) separated by comman:")
    is_numeric(s)

main()

我坚持不知道如何检查输入的数字是否符合这些要求。

感谢您的帮助!

顺便说一句,这是我从老师那里得到的一个问题,他在测验前发出练习问题,但我无法弄明白,他会在测验的同一天解决问题对我来说真的太迟了学习它。这不是一个等级。

3 个答案:

答案 0 :(得分:1)

执行此操作的简单方法是逐个字符处理字符串。但如果你是老师建议拆分点,我想他想要这样的伪代码:

def is_numeric(s):
    remove whitespace before and after the string
    split on the first '.'
    if and only if all of the split-out parts are all digits, return True

如果您了解stripsplitallisdigit函数,那么Python中的函数应该比伪代码更短,更易读。如果您不了解所有内容,Built-In FunctionsString Methods的文档应该填补空白。

现在,要查看输入整体是否有效,您需要在逗号上拆分并检查每个部分,所以:

parts = s.split(',')
if not all(is_numeric(part) for part in parts):
    result = []
else:
    result = [float(part) for part in parts]

如果这些理解超出了你的知识范围,你可以更详细地写出同样的内容:

parts = s.split(',')
result = []
for part in parts:
    if not is_numeric(part):
        result = []
        break
    else:
        result.append(float(part))

以下是整个事情:

def is_numeric(s):
    s = s.strip()
    parts = s.split('.', 1)
    return all(part.isdigit() for part in parts)

def parse_input(line):
    parts = line.split(',')
    if not all(is_numeric(part) for part in parts):
        return []
    else:
        return [float(part) for part in parts]

while True:
    line = input("You will provide numbers. Provide! Provide! ")
    if not line:
        break
    values = parse_input(line)
    print("Reporting provided numbers:", values)

以下是成绩单:

You will provide numbers. Provide! Provide! 1,2,3,4,5.6,7
Reporting provided numbers: [1.0, 2.0, 3.0, 4.0, 5.6, 7.0]
You will provide numbers. Provide! Provide! 1,2,3,4.4.3,a
Reporting provided numbers: []
You will provide numbers. Provide! Provide! 1, 2, 3, 4
Reporting provided numbers: [1.0, 2.0, 3.0, 4.0]
You will provide numbers. Provide! Provide! 1.2, 3.4.5
Reporting provided numbers: []
You will provide numbers. Provide! Provide!

值得测试交互式解释器中的一些表达式以查看它们的作用。如果你不确定它们是什么,那么在代码中间添加一些print语句来显示中间值。例如,如果您不知道向is_numeric提供了哪些内容,请将其print(s)。如果您想知道.split('.', 1)返回不同字符串的内容,请尝试:'1.2.3'.split('.', 1), '1.2'.split('.', 1), '1'.split('.', 1)。等等。

答案 1 :(得分:0)

我用正则表达式来解决这个问题。

# make sure the input is valid (probably a better way than sub) 
if input == ':)' or re.sub('^[\d\.,]+$', ':)', input) != ':)':
   return []

# get all the comma separated values and convert it to an array of floats
return [float(num) for num in re.findall('([\d\.]+),?', input)]

答案 2 :(得分:0)

首先我将输入标准化,以便我知道会发生什么。空格比逗号稍微容易处理,所以用空格分隔所有内容。

inpt.replace(',', ' ')

现在输入类似'2 3 4.5 6',每个要解析的值之间有一些非零空格。 split可以很好地处理。

inlist = inpt.split()

现在我们有一个列表,我们只需要知道是否需要将它丢弃。

if all([is_numeric(i) for i in inlist]):
  return [int(i, 10) if i.isdigit() else float(i) for i in inlist]
else:
  return []

那么,is_numeric是什么?它是一个函数,给定一个元素,确定它是int还是float。如果它不是其中之一,我们就扔掉它。 mgilson建议像

def is_numeric(i):
  try:
    float(i)
    return True
  except ValueError:
    pass
  return False

这会很棒,但是如果你不想尝试/除外,你仍然可以使用你的老师建议的split的第二个参数。

def is_numeric(i):
  parts = i.split('.', 1)
  if len(parts) == 2:
    characteristic, mantissa = parts # I really just wanted an excuse to use these terms
    if '.' in mantissa:
      return False
    return True
  elif i.isdigit():
    return True
  return False