我正在尝试接受用逗号分隔的用户输入,并根据输入的数据创建一个列表。例如,用户输入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()
我坚持不知道如何检查输入的数字是否符合这些要求。
感谢您的帮助!
顺便说一句,这是我从老师那里得到的一个问题,他在测验前发出练习问题,但我无法弄明白,他会在测验的同一天解决问题对我来说真的太迟了学习它。这不是一个等级。
答案 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
如果您了解strip
,split
,all
和isdigit
函数,那么Python中的函数应该比伪代码更短,更易读。如果您不了解所有内容,Built-In Functions和String 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