Что означает слишком много значений для распаковки в python mran?

#python #python-3.x #dictionary #for-loop #debugging

#python #python-3.x #словарь #для цикла #отладка

Вопрос:

Я новичок в python, я хочу распечатать словарь приведенного ниже кода в виде English:95 или English, 95 я использовал цикл for, но это не работает.

 grade8_midterm = {'English': 95, 'Maths': 99, 'German': 86, 'History':96, 'Science': 91}
grade8_final = {'English': 92, 'Maths': 100, 'German': 89, 'History':92, 'Science': 99}
for x, y in grade8_midterm.keys(), grade8_midterm.values():
    print (x, y)
  

Это результат, который я получаю:

     for x, y in grade8_midterm.keys(), grade8_midterm.values():
ValueError: too many values to unpack (expected 2)
  

Комментарии:

1. for x, y in zip(grade8_midterm.keys(), grade8_midterm.values()):

2. for x, y in grade8_midterm.items():

Ответ №1:

Попробуйте

 for x, y in grade8_midterm.items():
    print (x, y)
  

dict.items() вернет список кортежей пар ключ-значение в словаре

Пример,

 d = {'a':1, 'b':2, 'c':3}
(print(d.items())
  

Вывод

 dict_items([('a', 1), ('b', 2), ('c', 3)])
  

Комментарии:

1. nitpick: dict.items() возвращает коллекцию, подобную набору . Это не последовательность , не говоря уже о том, чтобы быть фактическим списком , например, он не индексируется и не нарезается.

2. Верно. Я пытался объяснить в терминах непрофессионала, так как OP сказал, что они новички.

Ответ №2:

Вы получили информацию о том, что вам следует делать, но вот в чем ошибка:

 grade8_midterm.keys(), grade8_midterm.values()
  

является литералом кортежа, «оператором кортежа» в Python является запятая, а скобки необязательны (если они однозначны). Итак, что вы пишете здесь, это

 for x, y in (a, b):
   ...
  

что эквивалентно

 for x, y in [a, b]:
   ...
  

с которым вы могли бы быть более знакомы.

Это означает, что вы действительно выполняете

 x, y = grade8_midterm.keys()
...
x, y = grade8_midterm.values()
...
  

это означает, что Python ожидает, что значение (правая часть назначения) будет содержать 2 элемента, чтобы назначить их 2 целям (левая часть назначения).

Поскольку ваш dict содержит 5 записей, он имеет 5 ключей, поэтому первое присвоение является несоответствием и вызывает ошибку, которую вы видите: Python ожидал получить 2 значения для распаковки (соответствующие LHS) и получил другое их количество.