Ошибка значения, когда в цикле for не должно быть?

#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. ах, я вижу, спасибо