Как использовать вход в качестве списка - PullRequest
1 голос
/ 08 марта 2020

Я сейчас закодировал:

a = [{1,2,3}, {3,4}, {2,8}]

Но возможно ли также получить этот список из пользовательского ввода?

Я пробовал это:

> a = (input("Enter your list like this and click enter: [{1,2,3},
> {3,4}] "))

Но, по-видимому, ввод «a» является строкой, а не списком, потому что далее по нескольким правилам я продолжаю выводить эту ошибку:

TypeError: unsupported operand type(s) for ^: 'set' and 'str'

Как я могу позволить пользователю заполнить что-то вроде списка выше и преобразовать это список / набор?

Надеюсь, кто-то понимает, что я имею в виду, это довольно сложно объяснить: P Кроме того, я не могу импортировать что-либо.

Ответы [ 3 ]

1 голос
/ 08 марта 2020

вы можете использовать ast.literal_eval :

from ast import literal_eval
a = literal_eval(input("Enter your list like this and click enter: [{1,2,3}, {3,4}] "))
# input [{1,2,3}, {3,4}] 

вывод:

[{1,2,3}, {3,4}] 

ast это встроенный модуль, а не сторонний

0 голосов
/ 08 марта 2020

Вот ограниченный синтаксический анализатор, предполагающий пользовательский ввод (str) списка наборов целых чисел.

Здесь используются обычные строковые методы. Это не то, что вы на самом деле хотите реализовать в реальном коде, но удовлетворяет требованиям ОП.

Код

def _to_ints(s):
    """Convert strings to int."""
    return map(int, s.split(","))


def _convert_container(s):
    """Convert strings to sets."""
    b = s[:]
    b = b.strip("{}[]()")
    b = _to_ints(b)
    res = set(b)
    return res


def parse(s: str) -> list:
    """Convert the string to objects.

    Assumes stringed list of sets.

    """
    s = s.strip("[]")
    s = s.replace(" ", "")
    lst = s.split("},")
    res = list(map(_convert_container, lst))
    return res

Тесты

assert [{1, 2, 3}] == parse("[{1,2,3}]")
assert [{1, 2, 3}, {5, 6}] == parse("[{1,2,3}, {5,6}]")
assert [{1, 2, 3}, {5, 6}] == parse("[{1, 2, 3}, {5, 6}]")
0 голосов
/ 08 марта 2020

@ ironkey сделал хорошее предложение - просто спросить каждый элемент подряд.

Если вы действительно хотите анализировать синтаксис Python, то для этого существует eval (). Тем не менее, обратите внимание, что обычно это не очень хорошая идея для чего-то реального. Делает ваш код fr agile и является проблемой безопасности, если вы получаете данные от реальных пользователей, которые могут запускать вредоносный код в вашей системе. Тем не менее, это работает так - хорошо играть с ним в учебных целях:

> inputstr = "[{1,2,3}, {3,4}, {2,8}]" #you can get this with input() which gives a string
> inputdata = eval(inputstr)
> inputdata
[{1, 2, 3}, {3, 4}, {8, 2}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...