Преобразование значения переменной в имя переменной и доступ к ранее сохраненным значениям

#python #variables

#python #переменные

Вопрос:

В настоящее время я пытаюсь создать какую-то простую систему рекомендаций для покупателей в винном магазине. После ответа на пару простых вопросов с помощью input() (тип алкоголя, например, вино, подтип, например, шираз, цена):

 class Customer(object):

    def __init__(self, alcohol, interest, budget, preference):
        self.alcohol = alcohol
        self.interest = interest
        self.budget = budget
        self.preference = preference

    # recording user input

    @classmethod
    def ask_customer(c):
        while True:

            # getting alcohol kind
            alcohol = input("What the customer would like to purchase?")
            if alcohol.lower() not in alcohol_types:
                print("Enter the right type of alcohol that we have in store")
                alcohol = input("> ")
            else:
                pass

            # getting the type of preferred alcohol
            interest = input(f"What type of {alcohol} is the customer is looking for?> ")
            if interest.lower() not in wine_types:
                print(f"Enter the right type of {alcohol}")
                interest = input("> ")
            else:
                pass

            # getting how much money the customer is willing to spend
            budget = input(f"How much is the customer willing to spend on a bottle of {interest}> ")
            if not budget.isdigit():
                print("Enter the number")
                budget = input("> ")
            else:
                pass

            # getting taste preferences of the customer
            preference = input(f"What style of {interest} is the customer looking for?")
            if preference.lower() not in preference_list:
                print(f"Enter a different description for {interest}")
                preference = input("> ")
            else:
                break
  

Затем я получаю доступ к списку списков с параметрами пользователя:

      if interest == "shiraz":
            # get_wines to extract items from shiraz list that satisfy the taste and price requirements
            chosen_wines = []

            for sublist in shiraz_list:
                if sublist[1] == budget and sublist[2] == preference:
                    chosen_wines.append(sublist[0])
                else:
                    continue

            if len(chosen_wines) == 1:
                print(chosen_wines[0])
            elif len(chosen_wines) > 1:
                print(random.choice(chosen_wines))
            else:
                print("No wines found")
  

Вот пример shiraz_list:

 shiraz_list = [
    ["Wine name 1", "15", "sweet"],
    ["Wine name 2", "15", "sweet"],
    ["Wine name 3", "10", "sweet"],
    ["Wine name 4", "5", "dry"],
    ["Wine name 5", "30", "sour"],
    ["Wine name 6", "20", "sweet"]
] 
  

Работает просто отлично. Проблема в том, что в настоящее время у меня есть 8 видов вина (merlot_list, cabernet_list и т.д.), Несколько сортов пива и спиртных напитков, и создание условия «если» для каждого из них на самом деле не кажется очень эффективным решением.

Чтобы решить эту проблему, я хочу использовать ввод пользователя (интерес), чтобы определить, к какому *_list необходимо получить доступ. Я знаю, что следующий код непростительно неправильный и никогда не будет работать, но он отразит и объяснит, что я пытаюсь здесь сделать:

 testlist = interest   "_list"
for sublist in testlist:
    if sublist[1] == budget and sublist[2] == preference:
        chosen_wines.append(sublist[0]) etc...
  

И здесь возникает вопрос: как мне получить доступ к существующему списку в зависимости от ввода клиента, не используя дюжину if s?

Комментарии:

1. Почти всегда ответ на вопрос «как мне превратить строку в переменную» — «не надо; используйте словарь».

Ответ №1:

Может быть, вы можете создать словарь, соответствующий интересам и спискам.

 # some sample lists
shiraz_list = [["Wine name 1", "15", "sweet"], ["Wine name 2", "15", "sweet"]]
merlot_list = [["Wine name 3", "10", "sweet"], ["Wine name 4", "5", "dry"]]
cabernet_list = [["Wine name 5", "30", "sour"], ["Wine name 6", "20", "sweet"]]

# we can use dictionary to create key:value pairs, then get value by key 
# which is similar to get value by index when using list 
interest_match = {
    "shiraz": shiraz_list,
    "merlot": merlot_list,
    "cabernet": cabernet_list
}

interest = input()

# interest_match[interest] get the list by interest, e.g. interest_match["shiraz"] return shiraz_list 
for sublist in interest_match[interest]:
    print(sublist[0])
  

Вывод:

 # Input: shiraz
Wine name 1
Wine name 2
# Input: merlot
Wine name 3
Wine name 4
# Input: cabernet
Wine name 5
Wine name 6
  

Ответ №2:

Я думаю, вы можете использовать ассоциативный массив или систему ключ-значение.

 alcohol = {}
for x in shiraz_list:
   alcohol["shiraz"].push(x)
for x in other_list:
   alcohol["other"].push(x)
  

и так далее. Затем вы можете получить к нему доступ следующим образом

 alcohol[input_variable][iteration]