#python #for-loop #if-statement #error-handling #action
#python #for-цикл #if-оператор #обработка ошибок #Экшен
Вопрос:
В следующем коде пользователь введет одно целое N
число как количество пар, которые он должен ввести следующим образом b
. Предположим, что введенный список b=[('r', 1),('a', 1),('a', 2),('a', 1),('r', 1),('r', 2)]
равен, а вывод должен быть B = [1] .Пользователь будет вводить данные, как показано ниже:
6
r 1
a 1
a 2
a 1
r 1
r 2
Код, выданный с ошибкой: «недостаточно значений для распаковки (ожидалось 2, получено 1)»
N = int(input())
B=[]
for i in range(N):
b = (input().split())
for (action, value) in b:
if action == 'a':
B.append(value)
elif action == 'r':
try:
B.remove(value)
except ValueError:
pass
Комментарии:
1. Пользователь вводит только целое число или букву и целое число?
2. вы понимаете, что на самом деле
b
перезаписывается N раз, и вы не получите N пар, не так ли?3. Буква и целое число точно такие же, как указано выше.
4.
str.split()
разделителем по умолчанию является любой пробел, поэтому результат будет зависеть от того, как именно пользователь вводит символ и число.
Ответ №1:
Если вы хотите создать список, вы должны сначала добавить пользовательский ввод в виде кортежа в список ‘b’, а затем выполнить цикл по нему и выполнить действия следующим образом:
N = int(input())
B=[]
b = []
for i in range(N):
user_input = input().split() # this returns a list
b.append(tuple(user_input)) # append user input as a tuple
# Handle actions here
for (action, value) in b:
if action == 'a':
B.append(value)
elif action == 'r':
try:
B.remove(value)
except ValueError:
pass
Ответ №2:
Вы пытаетесь выполнить итерацию по массиву значений, распаковывая каждый элемент в несколько переменных. Для этого вам необходимо иметь 2D-массив (первое измерение для перебора массива, второе измерение для распаковки значений).
Вы пытаетесь выполнить цикл по последнему значению, введенному пользователем. В вашем случае это r 2
то, на что разделяется ['r', '2']
. На первой итерации вы пытаетесь распаковать 'r'
в 2 переменные, что невозможно сделать.
Вместо этого вы должны просто распаковать значения по мере их ввода пользователем.
N = int(input())
B=[]
for i in range(N):
b = (input().split())
action, value = b
if action == 'a':
B.append(value)
elif action == 'r':
try:
B.remove(value)
except ValueError:
pass
Или используйте массив для хранения входных данных:
N = int(input())
B=[]
inputs = []
for i in range(N):
b = (input().split())
inputs.append(b)
for action, value in inputs:
if action == 'a':
B.append(value)
elif action == 'r':
try:
B.remove(value)
except ValueError:
pass