Python 简化实现用户选择的方法
我想让用户在命令提示符下选择列表的顺序。例如,我提供了一个包含3种食物的列表,然后用户可以根据订单决定他们早餐、午餐和晚餐想要什么 下面是我的代码,但我认为它的灵活性很差。如果我在列表中附加更多的项,我需要重写循环。有没有简单的实现方法 多谢各位Python 简化实现用户选择的方法,python,Python,我想让用户在命令提示符下选择列表的顺序。例如,我提供了一个包含3种食物的列表,然后用户可以根据订单决定他们早餐、午餐和晚餐想要什么 下面是我的代码,但我认为它的灵活性很差。如果我在列表中附加更多的项,我需要重写循环。有没有简单的实现方法 多谢各位 import os from msvcrt import getch def user_select_order(items, order): for i in range(2): os.system('cls') print(f
import os
from msvcrt import getch
def user_select_order(items, order):
for i in range(2):
os.system('cls')
print(f'Select {order[i]}:')
for j in range(3):
if items[j] in order:
print(f'\t{items[j]} - selected')
else:
print(f'\t{items[j]} - Press [{j+1}]')
while True:
ch = getch().decode('utf-8')
if ch in ('1', '2', '3'):
if items[int(ch)-1] not in order:
order[i] = items[int(ch)-1]
break
for item in items:
if item not in order:
order[-1] = item
break
os.system('cls')
return order
items = ['Apple', 'Banana', 'Orange']
order = ['Breakfast', 'Lunch', 'Dinner']
print(user_select_order(items, order))
为了能够处理不同大小的数据,您的代码不应该使用常量值,而应该只使用来自参数的值,例如它们的长度
- 将
替换为range(2)
range(len(items)-1)
- 对于范围(3)中的j,将
替换为
,以获取项及其索引对于idx,枚举(项)中的项
- 将
替换为('1','2','3')
map(str,range(1,len(items)+1))
len(items)+1在本例中为
4
为范围(1,长度(项目)+1)
1,2,3
是map(str,范围(1,len(项目)+1))
'1',2',3'
if
和放在同一个位置。最后,为了填充缺少的项,我建议使用set
操作,获得初始项集,删除顺序中的项,然后获得缺少的项(然后获得第一个,这是唯一的一个)
什么是getch()
?@azro它是“从msvcrt导入getch”我看到的。。。但这并没有告诉我它是什么,所以我再次问,它是什么?@azro对不起我的错误。它可以捕捉用户输入,但不会显示在屏幕上。请参阅
def user_select_order(items, order):
assert len(items) == len(order)
for i in range(len(items) - 1):
os.system('cls')
print(f'Select {order[i]}:')
for idx, item in enumerate(items):
if item in order:
print(f'\t{item} - selected')
else:
print(f'\t{item} - Press [{idx + 1}]')
while True:
ch = getch().decode('utf-8')
if ch in map(str, range(1, len(items) + 1)) and items[int(ch) - 1] not in order:
order[i] = items[int(ch) - 1]
break
missing_items = list(set(items) - set(order))
order[-1] = missing_items[0]
os.system('cls')
return order