如何让用户从有限列表中选择输入?

时间:2016-06-01 10:16:02

标签: python multiple-choice

我是python和编程的新手,所以如果它是一个" noob问题"我很抱歉。无论如何,是否有可能在python中选择多项选择,而没有if循环?

愚蠢的例子:

print "Do you want to enter the door"
raw_input ("Yes or not")

用户只能在选择之间进行选择。

6 个答案:

答案 0 :(得分:7)

如果您需要定期执行此操作,可以使用方便的库来帮助您轻松获得更好的用户体验:inquirer

免责声明:据我所知,它不会在没有黑客攻击的情况下在Windows上工作。

您可以使用pip安装inquirer:

pip install inquirer

示例1:多项选择

查询者的一个功能是让用户从带有键盘箭头键的列表中进行选择,而不是要求他们写出答案。这样,您就可以为控制台应用程序实现更好的用户体验。

以下是documentation

的示例
import inquirer
questions = [
  inquirer.List('size',
                message="What size do you need?",
                choices=['Jumbo', 'Large', 'Standard', 'Medium', 'Small', 'Micro'],
            ),
]
answers = inquirer.prompt(questions)
print answers["size"]

Inquirer example

示例2:是/否问题:

对于"是/否"像你这样的问题,你甚至可以使用询问者的确认:

import inquirer
confirm = {
    inquirer.Confirm('confirmed',
                     message="Do you want to enter the door ?" ,
                     default=True),
}
confirmation = inquirer.prompt(confirm)
print confirmation["confirmed"]

Yes no questions with Inquirer

其他有用的链接:

Inquirer's Github repo

答案 1 :(得分:2)

实现您所需要的一种可能方法是使用while循环。

print "Do you want to enter the door"
response = None
while response not in {"yes", "no"}:
    response = raw_input("Please enter yes or no: ")
# Now response is either "yes" or "no"

答案 2 :(得分:2)

对于使用提示工具包2或3的操作系统不可知的解决方案,请使用疑问句

https://github.com/tmbo/questionary

答案 3 :(得分:0)

对于使用 Python 3 的用户,并且希望使用不区分大小写的选项:

def ask_user():
    print("Do you want to save?")
    response = ''
    while response.lower() not in {"yes", "no"}:
        response = input("Please enter yes or no: ")
    return response.lower() == "yes"

而且,如果我能正确理解赋值表达式PEP 572),则可以在 Python 3.8 中做到这一点:

def ask_user():
    while r:= input("Do you want to save? (Enter yes/no)").lower() not in {"yes", "no"}:
        pass
    return r.lower() == "yes"

答案 4 :(得分:0)

如果您使用Windows,并且需要使用一个字符立即输入,则此方法应该起作用:

import os

inp = "yn"

if os.system("choice /c:%s /n /m \"Yes or No (Y/N)\"" % inp) - 2:
    # if pressed Y
    print("Yes")
else:
    # if pressed N
    print("No")

P。 S .:此代码可在Python 3上运行

答案 5 :(得分:0)

仅选择是或否,这有点大材小用,但这是一种通用解决方案,也适用于两个以上的选项。而且它不受不存在的选项的保护,将迫使用户提供新的有效输入。这没有任何进口。

第一个处理所有功能的函数:

def selectFromDict(options, name):

index = 0
indexValidList = []
print('Select a ' + name + ':')
for optionName in options:
    index = index + 1
    indexValidList.extend([options[optionName]])
    print(str(index) + ') ' + optionName)
inputValid = False
while not inputValid:
    inputRaw = input(name + ': ')
    inputNo = int(inputRaw) - 1
    if inputNo > -1 and inputNo < len(indexValidList):
        selected = indexValidList[inputNo]
        print('Selected ' +  name + ': ' + selected)
        inputValid = True
        break
    else:
        print('Please select a valid ' + name + ' number')

return selected

然后是一个包含所有选项的字典

options = {}
#     [USER OPTION] = PROGRAM RESULT
options['Yes'] = 'yes'
options['No'] = 'no'

然后使用选项调用函数

# Let user select a month
option = selectFromDict(options, 'option')

结果是:

> Select a option:
> 1) Yes
> 2) No
> option: 3
> Please select a valid option number
> option: 1
> Selected option: yes

如前所述,例如在一年中的所有月份重用上述功能都是可行的

months = {}
months['January'] = 'jan'
months['February'] = 'feb'
months['March'] = 'mar'
months['April'] = 'apr'
months['May'] = 'may'
months['June'] = 'jun'
months['July'] = 'jul'
months['August'] = 'aug'
months['September'] = 'sep'
months['October'] = 'oct'
months['November'] = 'nov'
months['December'] = 'dec'

# Let user select a month
month = selectFromDict(months, 'Month')

示例结果:

> Select a Month:
> 1) January
> 2) February
> 3) March
> 4) April
> 5) May
> 6) June
> 7) July
> 8) August
> 9) September
> 10) October
> 11) November
> 12) December
> Month: 5
> Selected Month: may