как обработать ошибку недостаточно значений для распаковки в цикле for

#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