Ошибка значения, когда не должно быть цикла for? - PullRequest
1 голос
/ 13 апреля 2019

это мой код:

    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 значения, но, очевидно, я ошибаюсь, кто-то может меня просветить?Я осмотрелся вокруг, но не нашел хороших ответов, шофар.любая помощь будет принята с благодарностью.Спасибо

контекст кода:

      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)

Ответы [ 3 ]

2 голосов
/ 13 апреля 2019

Оператор:

for percent, fail, title in currenttime:

означает распаковку каждого элемента в списке currenttime как последовательность, и все же каждый элемент в списке currenttime представляет собой просто строку, которая распаковывается в символы,из которых первый элемент имеет только два, что приводит к ошибке «недостаточно значений для распаковки (ожидается 3, получено 2)».

Для вашей цели вам нужно просто сжать 3 списка и перебрать *Генератор 1008 * вместо цикла 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)
0 голосов
/ 13 апреля 2019

Источник команды for должен быть итеративным. Ваш итеративный, который возвращает одну строку на каждой итерации. Первый элемент возвращает "67", в котором есть только два элемента для распаковки.

Для желаемой функциональности каждый элемент currentime должен быть тройным. Например:

currenttime = [
    ['67', '1', 'subsection'],
    ['18', '5', 'main branch'],
    ...
]

В в этом случае каждая итерация дает три значения для распаковки.

0 голосов
/ 13 апреля 2019

следующие строки:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...