Есть ли простой способ для пользователя выбрать, какие списки / строки можно гибко комбинировать?

#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()