#python #for-loop #valueerror
#python #for-цикл #ошибка значения
Вопрос:
это мой код:
while counter <= len(titles):
currenttime = [perc[counter], fails[counter], titles[counter]]
print(currenttime)
for percent, fail, title in currenttime:
Когда я запускаю его, я получаю сообщение об ошибке значения
ValueError: not enough values to unpack (expected 3, got 2)
Но когда я печатаю текущее время, я получаю
['67', '1', 'subsection']
Для меня это выглядит как 3 значения, но, очевидно, я ошибаюсь, может кто-нибудь просветить меня? Я осмотрелся, но не нашел хороших ответов shofar.
любая помощь будет с благодарностью. Спасибо
контекст кода:
n = 0
perc = list()
while n < len(piedata):
perc.append(piedata[n 2])
n = 3
print (perc)
n = 0
fails = list()
while n < len(piedata):
fails.append(piedata[n 1])
n = 3
print(fails)
n = 0
titles = list()
while n < len(piedata):
titles.append(piedata[n])
n = 3
print(titles)
counter = 0
while counter <= len(titles):
currenttime = [perc[counter], fails[counter], titles[counter]]
print(currenttime)
for percent, fail, title in currenttime:
piedata = [percent, (100-percent)]
fig = matplotlib.figure.Figure(figsize=(5, 5))
ax = fig.add_subplot(111)
ax.pie(piedata) # this is the information that the circle diagram will be made out of
ax.legend([('amount of attempts:', NOTT), ('amount of fails', fail)])
circle = matplotlib.patches.Circle((0, 0), 0.7, color='white')
ax.add_artist(circle)
# this is the code for actually putting the circle diagram/pie chart on the screen
canvas = FigureCanvasTkAgg(fig, master=window)
canvas.get_tk_widget().pack()
canvas.draw()
Label(window, text=(title, title), bg='light blue').pack()
counter = 1
window.mainloop()
print(percent)
print(fail)
Ответ №1:
Оператор:
for percent, fail, title in currenttime:
означает распаковку каждого элемента в currenttime
списке в виде последовательности, и все же каждый элемент в currenttime
списке представляет собой просто строку, которая распаковывается в символы, из которых у первого элемента всего два, что приводит к ошибке «недостаточно значений для распаковки (ожидалось 3, получено 2)».
Для вашей цели вы должны просто сжать 3 списка и выполнить итерацию по zip
генератору вместо while
цикла со счетчиком и внутренним for
циклом:
for percent, fail, title in zip(perc, fails, titles):
piedata = [percent, (100 - percent)]
fig = matplotlib.figure.Figure(figsize=(5, 5))
ax = fig.add_subplot(111)
ax.pie(piedata) # this is the information that the circle diagram will be made out of
ax.legend([('amount of attempts:', NOTT), ('amount of fails', fail)])
circle = matplotlib.patches.Circle((0, 0), 0.7, color='white')
ax.add_artist(circle)
# this is the code for actually putting the circle diagram/pie chart on the screen
canvas = FigureCanvasTkAgg(fig, master=window)
canvas.get_tk_widget().pack()
canvas.draw()
Label(window, text=(title, title), bg='light blue').pack()
window.mainloop()
print(percent)
print(fail)
Комментарии:
1. ах, большое вам спасибо за объяснение строковой вещи, я этого не знал. К сожалению, это должен быть список кортежей, из-за природы остальной части кода, знаете ли вы способ, которым я мог бы получить это, и иметь значения в том виде, в каком они есть в настоящее время. НАПРИМЕР: преобразование каждого из них в другой тип ?.
2. кроме того, добавили контекст кода в основной Q
3. Рад помочь. Теперь я вижу контекст вокруг вашего опубликованного кода, это подтверждает мое убеждение, что вам
currenttime
это вообще не нужно. Пожалуйста, дайте решение, которое я предоставил, используяzip
попытку. Он заменяет вашwhile
цикл, поэтому вам вообще не нужен внутреннийfor
цикл.4. не думаю, что у вас есть какой-либо опыт работы с matplotlib и tkinter? Я хочу, чтобы он создавал 2 круговые диаграммы, но из этого получается только одна
5. Извините, но, к сожалению, я этого не делаю. Вы получите гораздо лучшие ответы, если опубликуете его как новый вопрос, чтобы люди с нужными знаниями могли больше помочь.
Ответ №2:
Следующие строки:
for percent, fail, title in currenttime:
подразумевает, что currenttime
это список кортежей, когда это список в вашем примере, и который переводится как:
for (percent, fail, title) in currenttime:
что вы должны делать вместо этого, если хотите получить 3 элемента currenttime
:
percent = currenttime[0]
fail = currenttime[1]
title = currenttime[2]
или создайте currenttime
кортеж:
currenttime = (perc[counter], fails[counter], titles[counter])
percent, fail, title = currenttime
Ответ №3:
Источник for
команды должен быть итеративным. Ваш итеративный, который возвращает одну строку на каждой итерации. Возвращается первый элемент "67"
, который имеет только два элемента для распаковки.
Для нужной вам функциональности каждый элемент currentime
должен быть тройным. Например:
currenttime = [
['67', '1', 'subsection'],
['18', '5', 'main branch'],
...
]
В этом случае каждая итерация выдает три значения для распаковки.
Комментарии:
1. ах, я вижу, спасибо