#python #list #input #choice
#python #Список #ввод
Вопрос:
У меня есть много разных категорий списков. Я пытаюсь найти эффективный способ, позволяющий пользователю вводить данные, чтобы указать сценарию, какие списки использовать для действия.
Например, у меня есть 20 разных списков, и пользователь хочет использовать 3 из них для объединения в один временный список, каков наилучший способ закодировать это?
Я довольно новичок в python, поэтому мой первый инстинкт — просто использовать миллион if-операторов, но я сомневаюсь, что это самый эффективный способ сделать что-то.
Ожидаемый результат:
list1
list2
list3
list4
list5
пользователь почему-то говорит «дайте мне списки 2, 4 и 5.
и создается список пользователей, который List0 = list2 list4 list5
Комментарии:
1. Как вы определяете свой
lists
?
Ответ №1:
Поместите все списки в словарь.
all_lists = {"list1": list1, "list2": list2, ...}
Затем пользователь выбирает 3 списка:
name1 = input("First list name:")
name2 = input("Second list name:")
name3 = input("Third list name:")
list0 = all_lists[name1] all_lists[name2] all_lists[name3]
Комментарии:
1. хорошо, спасибо. Но если моему пользователю нужны только 2 списка, а не 3, нет ли способа создать его так, чтобы он хорошо масштабировался с тем, сколько списков они хотят?
2. вы можете поместить входные данные в список и выполнить цикл по списку для объединения.
Ответ №2:
Если бы я должен был разделить эту проблему на несколько задач программирования (разделяй и властвуй), я бы беспокоился о пользовательском вводе в качестве первого и конкатенации списков в качестве второго.
Самый простой способ для пользователя указать списки — использовать метод input(). Пример ниже:
user_input = input("Please enter the list indexes")
list_indexes = user_input.split(',')
Используя приведенный выше код, пример некоторого пользовательского ввода и результат можно найти ниже:
Пользовательский ввод: ‘1, 4, 5’
list_indexes = ['1', '4', '5']
Теперь, когда мы обработали пользовательский ввод, мы можем использовать это для объединения списков.
Нам нужно иметь возможность доступа к каждой из категорий с одной и той же ссылкой (если вы хотите знать, почему, пожалуйста, дайте мне знать, и я объясню). Один из способов сделать это — поместить все ваши списки категорий в более крупный список под названием «категории»
categories = [list1, list2, list3,...,list(n)]
Затем мы можем перебирать категории и извлекать нужные нам данные.
concatenated_list = []
for index, category in enumerate(categories):
if (index in (int(i) for i in list_indexes):
concatenated_list.extend(category)
Комментарии:
1. вау, спасибо, это было безумно полезно. Я сам пытался использовать стратегию «разделяй и властвуй». Это просто грубо, так как я еще не знаю, что делают многие разные команды. Я даже никогда не видел некоторые из них раньше.
2. Все в порядке, мы все с чего-то начинали. Продолжайте в том же духе, и все они достаточно скоро обретут смысл
Ключевые методы, за которыми следует следить: enumerate (возвращает индекс и значение элементов в коллекции), i для i в списке (это называется пониманием списка (безумно полезно)), list.extend(очень похоже на list.append) => geeksforgeeks.org/append-extend-python
3. на самом деле я думаю, что с этим последним блоком кода может быть что-то не так. Python видит синтаксические ошибки в операторе if
4. неважно. ошибка с моей стороны. Единственное, что еще нужно в настоящее время, это то, что метод user_input.split(), хотя и полезный, все еще выдает мне список строк, где мне нужны категории = [], чтобы содержать фактические переменные списка.
5. Категории не должны содержать фактические переменные списка, для этого и предназначена переменная concatenated_list. Дайте мне знать, если у вас это не сработает.
Ответ №3:
Вы можете использовать InquirerPy, чтобы позволить пользователю выбирать списки
#! /usr/bin/env python3
from InquirerPy import inquirer
from InquirerPy.base.control import Choice
lists = {'list1':[1,2,3], 'list2':['a', 'b', 'c'], 'list3':['something', 'else'], 'list4': []}
def t(result):
l = []
for r in result:
l = lists[r]
return l
inquirer.select(
message="Select lists:",
choices=lists.keys(),
multiselect=True,
transformer=t
).execute()