如何检查用户输入的类型是否为列表

时间:2019-01-30 18:31:31

标签: python python-3.x

我正在尝试构建一个程序,该程序可以模仿我正在上课的一个测验的答案检查,因为我有兴趣想知道机器如何检查我的答案是否正确。

测验是要输入一个至少包含一个字符串,一个整数和一个浮点数的列表。

我想我知道如何检查列表是否包含三种对象类型。我只是不知道如何检查输入是否为列表,因为输入始终是字符串。

到目前为止我的代码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.')

谢谢!

3 个答案:

答案 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

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")