Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 13, 2015 17:48:45

seriy_volk
Зарегистрирован: 2015-01-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

ValueError: too many values to unpack (expected 2)

Друзья,
Занимаюсь по книге Доусона “Программируем на Python”. Запнулся на 7 главе, задание 3 (сохранение рекордов в текстовом файле). Не могу вывести таблицу рекордов пользователю. Подскажите пожалуйста, в чем может быть проблема.

Traceback (most recent call last):
_challenge.py“, line 126, in <module>
main()
_challenge.py”, line 90, in main
welcome(title)
_challenge.py“, line 62, in welcome
display_highscores()
_challenge.py”, line 74, in display_highscores
score, name = line
ValueError: too many values to unpack (expected 2)

Функции:

# добавляем запись в таблицу рекордов
def add_highscore(name, score):
    highscore_file = open_file("highscore.txt", "a")
    entry = (score, name)
    highscore_file.writelines(str(entry))
    highscore_file.close()

# выводим таблицу рекордов
def display_highscores():
    highscore_file = open_file("highscore.txt", "r")
    print("Таблица рекордов\n")
    print("Имя\tОчки")
    for line in highscore_file:
        score, name = line
        print(name, "\t", score)
    highscore_file.close()

Отредактировано seriy_volk (Янв. 13, 2015 17:49:42)

Офлайн

#2 Янв. 13, 2015 18:02:25

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

ValueError: too many values to unpack (expected 2)

У тебя line это одна строка из файла, она присваивается переменной score, а переменной name ты ничего не присваиваешь, хотя указал, что будешь. Отсюда и ошибка.

Отредактировано alex925 (Янв. 13, 2015 18:08:45)

Офлайн

#3 Янв. 13, 2015 18:13:00

seriy_volk
Зарегистрирован: 2015-01-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

ValueError: too many values to unpack (expected 2)

Почему тогда тут работает? (из примеров к книге)

scores = []
# display high-score table
    elif choice == "1":
        print("High Scores\n")
        print("NAME\tSCORE")
        for entry in scores:
            score, name = entry
            print(name, "\t", score)

Отредактировано seriy_volk (Янв. 13, 2015 18:14:06)

Офлайн

#4 Янв. 13, 2015 18:23:04

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

ValueError: too many values to unpack (expected 2)

Потому что видимо scores хранит набор последовательностей (кортежи, спики), которые распаковываются и присваиваются 2 твоим переменным.

Вот пример:
а ссылается на последовательность (кортеж), если мы используем множественное присваивание, то он автоматически распаковывается и значения присваиваются переменным.

>>> a = ('1', '2', '3')
>>> x, y, z = a
>>> x
'1'
>>> y
'2'
>>> z
'3'

Отредактировано alex925 (Янв. 13, 2015 18:28:57)

Офлайн

#5 Янв. 13, 2015 21:25:23

seriy_volk
Зарегистрирован: 2015-01-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

ValueError: too many values to unpack (expected 2)

Ничего более умного, чем сделать без кортежей не придумал. Но так или иначе оно работает. Хотел еще опционально сортировку таблицы рекордов запилить, но она косячит. Может есть какие рекомендации?

def display_highscore():
    highscore_file = open_file("highscore.txt", "r")
    print("Таблица рекордов\n")
    print("Очки\tИмя")
    highscore = highscore_file.read()
    print(highscore)
    highscore_file.close()
def add_highscore(name, score):
    highscore_file = open_file("highscore.txt", "a")
    entry = (score, "\t", name, "\n")
    highscore_file.writelines(entry)
    highscore_file.close()
def sort_highscore():
    lines = []
    # sort this highscores
    highscore_file = open_file("highscore.txt", "r")
    for line in highscore_file:
        lines.append(line)
    lines.sort(reverse=True)
    highscore_file.close()
    # write sorted highscores
    highscore_file = open_file("highscore.txt", "w")
    for line in lines:
        highscore_file.write(line)
    highscore_file.close()

Офлайн

#6 Янв. 13, 2015 21:33:54

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

ValueError: too many values to unpack (expected 2)

seriy_volk
Покажи содержимое фала highscore

Офлайн

#7 Янв. 13, 2015 21:38:27

seriy_volk
Зарегистрирован: 2015-01-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

ValueError: too many values to unpack (expected 2)

alex925
seriy_volkПокажи содержимое фала highscore
500	R
500	D
300	E
1100	Boom
100	T
100	D
0	D

1100 Boom отсортировался неверно

Отредактировано seriy_volk (Янв. 13, 2015 21:39:09)

Офлайн

#8 Янв. 13, 2015 21:43:49

alex925
Зарегистрирован: 2015-01-08
Сообщения: 204
Репутация: +  14  -
Профиль   Отправить e-mail  

ValueError: too many values to unpack (expected 2)

seriy_volk
Может есть какие рекомендации
Да есть, не надо изобретать велосипеды, если чуть поменять функцию display_highscores, то все будет работать. Вот, держи:
def display_highscores():
    highscore_file = open_file("highscore.txt", "r")
    print("Таблица рекордов\n")
    print("Имя\tОчки")
    for line in highscore_file.strip():
        score, name = line.split(' ')
        print(name, "\t", score)
    highscore_file.close()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version