1
votes

Erreur de valeur alors qu'il ne devrait pas y avoir de boucle for?

voici mon code:

      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)

Lorsque je l'exécute, j'obtiens une erreur de valeur indiquant

['67', '1', 'subsection']

Mais lorsque j'imprime heure actuelle , j'obtiens

ValueError: not enough values to unpack (expected 3, got 2)

Pour moi, cela ressemble à 3 valeurs, mais évidemment je me trompe, quelqu'un pourrait-il m'éclairer? J'ai regardé autour de moi, mais je n'ai trouvé aucune bonne réponse shofar. toute aide serait grandement appréciée. Merci

contexte de code:

    while counter <= len(titles):
        currenttime = [perc[counter], fails[counter], titles[counter]]
        print(currenttime)
        for percent, fail, title in currenttime:


0 commentaires

3 Réponses :


3
votes

L'instruction:

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)

signifie décompresser chaque élément de la liste currenttime comme une séquence, et pourtant chaque élément du currenttime code > list est juste une chaîne, qui se décompresse en caractères, dont le premier élément n'a que deux, ce qui entraîne l'erreur "pas assez de valeurs pour décompresser (attendu 3, obtenu 2)".

Pour vos besoins , vous devez simplement compresser les 3 listes et parcourir le générateur zip au lieu d'une boucle while avec un compteur et une boucle interne for :

for percent, fail, title in currenttime:


5 commentaires

ah, merci beaucoup d'avoir expliqué le truc des cordes, je ne le savais pas. Malheureusement, il doit s'agir d'une liste de tuples, en raison de la nature du reste du code, connaissez-vous un moyen d'obtenir cela et d'avoir les valeurs telles qu'elles sont actuellement. EG: convertir chacun en un type différent ?.


également, ont ajouté le contexte du code au Q principal


Heureux d'avoir pu aider. Maintenant, je vois le contexte autour de votre code publié, cela réaffirme ma conviction que vous n'avez pas du tout besoin de currenttime . Veuillez essayer la solution que j'ai fournie en utilisant zip . Il remplace votre boucle while , vous n'avez donc pas du tout besoin d'une boucle interne for .


ne supposez pas que vous ayez une expérience avec matplotlib et tkinter? Je veux qu'il fasse 2 diagrammes circulaires, mais à partir de là, il n'en fait qu'un


Désolé mais malheureusement pas. Vous obtiendrez de bien meilleures réponses si vous la postez comme nouvelle question afin que les personnes possédant les bonnes connaissances soient plus en mesure de vous aider.



0
votes

Les lignes suivantes:

currenttime = (perc[counter], fails[counter], titles[counter])
percent, fail, title = currenttime

implique que currenttime est une liste de tuples, quand c'est une liste dans votre exemple, et qui se traduit par: p >

percent = currenttime[0] 
fail = currenttime[1] 
title = currenttime[2]

ce que vous devriez faire à la place si vous voulez obtenir les 3 éléments de currenttime:

for (percent, fail, title) in currenttime:

ou faites de currenttime un tuple:

for percent, fail, title in currenttime:


0 commentaires

0
votes

La source d'une commande for doit être une itérable. Le vôtre est un itérable qui renvoie une chaîne à chaque itération. Le premier élément renvoie "67" , qui n'a que deux éléments à décompresser.

Pour la fonctionnalité que vous souhaitez, chaque élément de currentime devrait être un triple. Par exemple:

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

Dans ce cas, chaque itération donne trois valeurs à décompresser.


1 commentaires

ah, je vois, thaankyou