Python 简化实现用户选择的方法

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

我想让用户在命令提示符下选择列表的顺序。例如,我提供了一个包含3种食物的列表,然后用户可以根据订单决定他们早餐、午餐和晚餐想要什么

下面是我的代码,但我认为它的灵活性很差。如果我在列表中附加更多的项,我需要重写循环。有没有简单的实现方法

多谢各位

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