Python 检查输入是否为数字或句点

Python 检查输入是否为数字或句点,python,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()

我正在尝试使用逗号分隔的用户输入,并根据输入的数据创建一个列表。例如,用户输入
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()
我一直在思考如何检查输入的数字是否符合这些要求

谢谢你的帮助


顺便说一句,这是我从一位老师那里收到的一道题,他在测验前给我出练习题,但我不明白,他会在测验的同一天复习这些题,这对我来说实在太晚了,我学不懂。这不是分数。

实现这一点的简单方法是逐个字符遍历字符串。但若你们是老师建议的在点上分裂,我想他想要像这样的伪代码:

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
如果您知道
strip
split
all
isdigit
函数,那么Python中的这些函数应该比伪代码更短,可读性更强。如果您不了解所有信息,则和的文档应填补空白

现在,要查看输入作为一个整体是否有效,需要使用逗号拆分并检查每个部分,因此:

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!

在交互式解释器中测试一些表达式是值得的,以了解它们的作用。在代码中间添加一些<代码>打印< /COD>语句,以显示中间值,如果您不确定它们是什么。例如,如果您不知道输入到
的内容是数字的,请将其打印出来。如果您想知道
.split('',1)
对不同字符串返回什么,请尝试:
'1.2.3'.split('',1),'1.2'.split('',1),'1'.split('',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
如果您知道
strip
split
all
isdigit
函数,那么Python中的这些函数应该比伪代码更短,可读性更强。如果您不了解所有信息,则和的文档应填补空白

现在,要查看输入作为一个整体是否有效,需要使用逗号拆分并检查每个部分,因此:

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!

在交互式解释器中测试一些表达式是值得的,以了解它们的作用。在代码中间添加一些<代码>打印< /COD>语句,以显示中间值,如果您不确定它们是什么。例如,如果您不知道输入到
的内容是数字的,请将其打印出来。如果您想知道
.split('',1)
对不同字符串返回什么,请尝试:
'1.2.3'.split('',1),'1.2'.split('',1),'1'.split('',1)
。等等。

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

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

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

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

首先,我要规范化输入,这样我就知道会发生什么。空格比逗号更容易处理,所以用空格分隔所有内容

inpt.replace(',', ' ')
现在输入类似于
'2 3 4.5 6'
,每个要解析的值之间有一些非零的空格<代码>拆分
可以很好地处理这个问题

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 []
那么,什么是数字?它是一个函数,给定一个元素,确定它是
int
还是
float
。如果不是那种,我们就扔了。mgilson提出了类似的建议

def is_numeric(i):
  try:
    float(i)
    return True
  except ValueError:
    pass
  return False
这很好,但是如果你不想尝试/除外,你仍然可以使用第二个参数来分割你老师建议的

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

首先,我要规范化输入,这样我就知道会发生什么。空格比逗号更容易处理,所以用空格分隔所有内容

inpt.replace(',', ' ')
现在输入类似于
'2 3 4.5 6'
,每个要解析的值之间有一些非零的空格<代码>拆分
可以很好地处理这个问题

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 []
那么,什么是数字?它是一个函数,给定一个元素,确定它是
int
还是
float
。如果不是那种,我们就扔了。mgilson提出了类似的建议

def is_numeric(i):
  try:
    float(i)
    return True
  except ValueError:
    pass
  return False
这很好,但是如果你不想尝试/除外,你仍然可以使用第二个参数来分割你老师建议的

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

你知道除了之外的和吗?在这里,我将
尝试
将字符串转换为
浮点
,然后在失败时处理错误。不幸的是,我还没有学习try或except…:(我的老师暗示说,对于多点,可以使用split()方法,ex 4.5。6@mgilson:但是
float
在空格或单点上不起作用。这就是我在想的…使用ascii.digits和ascii.lowercase在这个问题上有什么好处吗?@user2840144提示:
str.split
需要多少个参数?你知道
try
除了
之外吗?这里我将uld
try
将字符串转换为
float
,然后在失败时处理错误。不幸的是,我还没有学习try或except…:(我的老师提示,对于多点,可以使用split()方法,例如4.5。6@mgilson:但是
float
不起作用