我正在尝试构建一个程序,该程序可以模仿我正在上课的一个测验的答案检查,因为我有兴趣想知道机器如何检查我的答案是否正确。
测验是要输入一个至少包含一个字符串,一个整数和一个浮点数的列表。
我想我知道如何检查列表是否包含三种对象类型。我只是不知道如何检查输入是否为列表,因为输入始终是字符串。
到目前为止我的代码https://pastebin.com/aiMxuJwm
# try to create a code that can check whether the input list has at least one string, one integar and one float
alist = input('please type your answer here. Make sure it is a list and has at least one string, one integar and one float.')
element_type = []
if type(alist) == list:
# this does not work because input always convert to str and use list() will always convert a str to list
for element in alist:
element_type = element_type + [type(element)]
if str in element_type and int in element_type and float in
element_type:
print('You nailed it. Now you can continue to next session.')
else:
print('The answer is incorrect.Please try again.')
else:
print('The answer is incorrect. Please try again.')
谢谢!
答案 0 :(得分:0)
input
(在Py3中)无论用户输入什么类型(请检查文档)都返回一个字符串:
In [166]: x = input('input please: ')
input please: testing one two three
In [167]: x
Out[167]: 'testing one two three'
In [168]: type(x)
Out[168]: str
如果您认为此输入为列表,我怀疑您是(在心理上)将其拆分为空白(或其他类似逗号的内容):
In [169]: alist = x.split()
In [170]: alist
Out[170]: ['testing', 'one', 'two', 'three']
In [171]: type(alist)
Out[171]: list
split
的结果将始终是一个列表,尽管它可能仅包含一项。
这些子字符串是否表示数字或其他内容,取决于进一步的测试。现在它们只是字符串,而不是浮点数或整数。
测试字符串,浮点数和/或整数需要考虑以下情况:
In [173]: x = input('input please: ')
input please: one 2 2.34
In [174]: x
Out[174]: 'one 2 2.34'
In [175]: alist = x.split()
In [176]: alist
不代表浮点数的字符串:
Out[176]: ['one', '2', '2.34']
In [177]: float(alist[0])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-177-aa7191219228> in <module>()
----> 1 float(alist[0])
ValueError: could not convert string to float: 'one'
In [178]: float(alist[1])
Out[178]: 2.0
In [179]: float(alist[2])
Out[179]: 2.34
一个浮点数,但不是整数:
In [180]: int(alist[2])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-180-6d641dbd1dad> in <module>()
----> 1 int(alist[2])
ValueError: invalid literal for int() with base 10: '2.34'
首先,我要编写一个函数,该函数采用字符串,并使用适当的try/except
包装器应用测试,并返回某种type
指示符。然后将该函数应用于alist
的字符串。
可能还有其他方法可以进行此测试,但这只是一个开始。
这里的关键是确保您知道每个步骤中的对象。你什么时候有琴弦?字符串列表?代表浮点数或整数的字符串?
另一种方法是考虑包含字符串和数字的列表的样子-作为列表及其字符串表示形式:
In [188]: alist = ['one', 2, 2.34]
In [189]: str(alist)
Out[189]: "['one', 2, 2.34]"
json
是表示各种语言可以处理的简单数据结构的好工具:
In [191]: import json
In [192]: json.dumps(alist)
Out[192]: '["one", 2, 2.34]'
In [193]: json.loads(_)
Out[193]: ['one', 2, 2.34]
其他人建议使用ast
。像json
这样对您想要的输入可能会更加挑剔:
In [204]: x = input('input please: ')
input please: ['one', 2, 2.34]
In [205]: x
Out[205]: "['one', 2, 2.34]"
In [206]: ast.literal_eval(x)
Out[206]: ['one', 2, 2.34]
In [207]: x = input('input please: ')
input please: 'one', 2, 2.34
In [208]: x
Out[208]: "'one', 2, 2.34"
In [209]: ast.literal_eval(x)
Out[209]: ('one', 2, 2.34)
如果我省略[]
,它将返回一个元组,而不是一个列表。如果不加引号,则会出现错误。如果我引用该数字,则它仍然是一个字符串。我必须使用逗号而不是空格。
Py2有2个输入函数,一个可能返回类似于Py3 input
的字符串,而另一个则解释该字符串:
>>> x = input('test:')
test:[1,2,3]
>>> x
[1, 2, 3]
>>> type(x)
<type 'list'>
>>> x = rawinput('test:')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'rawinput' is not defined
>>> x = raw_input('test:')
test:[1,2,3]
>>> x
'[1,2,3]'
>>> type(x)
<type 'str'>
help
的{{1}}是:
等效于eval(raw_input(prompt))
答案 1 :(得分:0)
像chepner建议的一种方法是使用#!/usr/bin/python
"""
try to create a code that can check whether the input list
has at least one string, one integar and one float
"""
import ast
alist = ast.literal_eval(
input('Please type your answer here.'
'Make sure it is a list and has at least one string,'
' one integar and one float.')
)
if isinstance(alist, list):
element_type = list(map(type, alist))
if str in element_type and int in element_type and float in element_type:
print('You nailed it. Now you can continue to next session.')
exit(0)
print('The answer is incorrect. Please try again.')
评估用户输入,然后在代码中使用结果:
// MyButton.tsx
import { TouchableWithoutFeedback } from "react-native"
interface Props {
onPress: () => void
}
//...
<TouchableWithoutFeedback onPress={this.props.onPress} />
答案 2 :(得分:0)
将argparse与int类型的参数一起使用,或将nargs='+'
指定为int列表的另一个参数参数:
import argparse
parser = argparse.ArgumentParser(description="Some input")
# int type
parser.add_argument("-i", "--input", dest="input", default=None, type=int, help="Input argument")
# list of ints type
parser.add_argument("-i", "--input", dest="input", default=None, type=int, nargs='+', help="Input argument")