Как получить ввод как подсписок от пользователя через функцию ввода в python-3? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь получить от пользователя что-то вроде этого: [[1,2,3], 4, 5] . в котором [1,2,3] в списке тип и 4 и 5 в типе int .

как я могу сделать это методом ввода?

вот мой код, но в котором все в строковом типе.

in_list = input("Enter your list :- ").split()
print(in_list)
print(type(in_list[0]))
print(type(in_list[1]))

Выход: -

Введите ваш список: - 1,2,3 4 5
['1,2,3', '4', '5']
класс 'str'
класс 'str'

Ответы [ 4 ]

0 голосов
/ 12 января 2019

Используйте ast.literal_eval() (как прокомментировал Даниэль Месехо):

import ast
in_list = ast.literal_eval(input("Enter your list :- "))
print(in_list)
print(type(in_list[0]))
print(type(in_list[1]))

Выход:

[[1, 2, 3], 4, 5]
<class 'list'>
<class 'int'>

В дополнение к ast.literal_eval() другой пользователь предложил просто использовать eval(), что также работает. Для обсуждения того, почему безопаснее использовать ast.literal_eval(), обратитесь к этому связанному вопросу: Использование python eval () против ast.literal_eval ()? .

Из ast документации:

Это можно использовать для безопасной оценки строк, содержащих значения Python из ненадежных источников, без необходимости разбора значений самостоятельно. Он не способен вычислять произвольно сложные выражения, например, с использованием операторов или индексации.

0 голосов
/ 11 января 2019

вы можете использовать eval:

inp = input("Enter your list :- ").strip()
inp = eval(inp)
0 голосов
/ 11 января 2019

Немного дольше, но это еще один вариант.

my_string - пользовательский ввод, метод работает и для этого вида ввода:

my_str = '1,2,3 4 5 7,8,9 10 11'

res = [ e.split(',') for e in my_str.split(' ') ]
for i, e in enumerate(res):
  if len(e) == 1:
    res[i] = int(e[0])
  else:
    res[i] = [ int(ee) for ee in e ]

print(res)
#=> [[1, 2, 3], 4, 5, [7, 8, 9], 10, 11]
0 голосов
/ 11 января 2019

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

Для ввода, представленного в следующем виде: 1,2,3 4 5, как указано в примере, вы можете изменить строку и преобразовать в int по следующим строкам, используя либо списки, либо карты.

in_list = input("Enter your list :- ").split()
print(in_list)

in_list[0] = [int(s) for s in in_list[0].split(',')] #split on comma, typecast to int, reassign to 0th index
in_list[1:] = [int(s) for s in in_list[1:]] #typecast remaining values to int

#Alternate syntax using map
#in_list[0] = list(map(int,in_list[0].split(',')))
#in_list[1:] = list(map(int, in_list[1:]))

print(in_list)
#Output:
[[1, 2, 3], 4, 5]
...