1

我正在尝试接受以逗号分隔的用户输入,并从输入的数据创建一个列表。例如,用户输入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()

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

谢谢你的帮助!

顺便说一句,这是我从一位老师那里收到的问题,他在测验前给出了练习题,但我无法弄清楚,他会在测验的同一天复习这些问题,这对我来说真的来不及学习了. 这不是为了一个档次。

4

3 回答 3

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 中这应该比在伪代码中更短、更易读。如果您不了解所有内容,内置函数字符串方法的文档应该会填补空白。

现在,要查看整个输入是否有效,您需要用逗号分隔并检查每个部分,因此:

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). 等等。

于 2013-10-16T01:06:40.387 回答
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)]
于 2013-10-16T01:11:03.960 回答
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?这是一个函数,给定一个元素,确定它是否是一个intfloat不是。如果它不是其中之一,我们就扔掉它。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
于 2013-10-16T01:11:44.807 回答