Управление списками и использование STDIN - PullRequest
1 голос
/ 22 марта 2019

Я работаю над этим примером в Интернете, и я пытаюсь понять код.

В примере говорится, что пример ввода

    12
    insert 0 5
    insert 1 10
    insert 0 6
    print 
    remove 6
    append 9
    append 1
    sort 
    print
    pop
    reverse
    print

и что с применением этого кода

L=[];
t=int(input());
for i in range(0,t):
    cmd=input().split();
    if cmd[0] == "insert":
        L.insert(int(cmd[1]),int(cmd[2]))
    elif cmd[0] == "append":
        L.append(int(cmd[1]))
    elif cmd[0] == "pop":
        L.pop();
    elif cmd[0] == "print":
        print L
    elif cmd[0] == "remove":
        L.remove(int(cmd[1]))
    elif cmd[0] == "sort":
        L.sort();
    else:
        L.reverse();

я должен получить вывод, подобный следующему:

Пример вывода

[6, 5, 10]
[1, 5, 9, 10]
[9, 5, 1]

У меня есть все ингредиенты, но я не могу понять это.Моя проблема в том, что я не знаю, как мне следует ввести пример ввода (т. Е. В каком формате?), Нужно ли его вводить в виде списка или в виде строки. Я действительно не уверен.Пожалуйста, помогите

Большое спасибо

1 Ответ

1 голос
/ 22 марта 2019

Чтобы понять, что происходит, давайте посмотрим на код по частям.
Сначала объявляется пустой список. В нем будут храниться все значения

L=[];

Затем пользователю предлагается ввести размер ввода, это значение (string) преобразуется (приводится) в целое число (int).

t=int(input());

Это могло бы быть более явным, добавив некоторую информацию для чтения пользователем.

t=int(input('Please enter the size of your input\n'));

После этого программа зациклится t раз.

for i in range(0,t):

В этом цикле пользователю сначала предлагается ввести ввод (здесь команда). Этот вход разделен: функция split() преобразует string в список строк (которые были разделены пробелом) с именем cmd.

    cmd=input().split();

Опять же, это может быть более явным.

    cmd=input('Please enter a command\n').split();

Теперь мы «переключаемся» (в питоне нет переключателя, поэтому это серия «если, еще если, еще если ...») в команде и действуем соответственно.

    if cmd[0] == "insert":
        L.insert(int(cmd[1]),int(cmd[2]))
    elif cmd[0] == "append":
        L.append(int(cmd[1]))
    elif cmd[0] == "pop":
        L.pop();
    elif cmd[0] == "print":
        print L
    elif cmd[0] == "remove":
        L.remove(int(cmd[1]))
    elif cmd[0] == "sort":
        L.sort();
    else:
        L.reverse();

Теперь вы можете видеть, почему ваш ввод начинается с 12 в первой строке, это число строк ниже, которое ваша программа должна прочитать, и оно будет сохранено в t. Если он слишком мал, например, 6, ваша программа будет читать только 6 первых команд. Если он слишком большой, например, 42, ваша программа будет ожидать ввода большего количества данных и останется в цикле. Он будет выглядеть так, как будто он застрял, в то время как на самом деле он ожидает только ввода от stdin

Чтобы ответить на ваш последний комментарий об ошибке, когда ваша первая строка ввода insert 0 5, интерпретатор python пытается преобразовать его в целое число и сохранить в t. Поскольку это невозможно (insert 0 5 не является строкой, представляющей целое число), происходит сбой.
Вы можете уловить эту ошибку с помощью try .. except конструкции, подобной этой

while True:
    try:
        t=int(input('Please enter the size of your input\n'));
        break
    except ValueError:
        print('You must input an integer! Try again.')
...