2016-04-29 10 views
0

Zunächst sind unten die Liste nicht Tupel möchte auch die Daten in der Liste anfügen und vor allem, dass den Grund des Fehlers kennen müssen mit LösungFehler: zu viele Werte zu entpacken (erwartet 2) - Python

Versucht, zwei Listen im Grunde zu vergleichen, hier ist "ref" die Referenzliste und "obt" ist Produktliste, während beim Ausführen von Code (unten) ein Fehler generiert wird.

Was ist die Lösung dafür?

Auch möchte ich das gleiche auf die Datenrahmen in Pandas anwenden, was sollte der Code dafür sein?

ref =[1,2,3,4] 
obt =[0.5,1,1.5,5] 
i,j=0 
for i,j in obt,ref: 
    global i,j 
    if (obt[i] <= ref[j]): 
     print ("all ok") 
    else: 
     print("error") 
    i=i+1 
    j=j+1 
+0

Dies ist nicht das Problem, aber Sie brauchen nicht global innerhalb einer for-Schleife –

+0

Sie sollten sich die Antwort, die 'z ip' Ich glaube, das ist der beste Weg, um über zwei Listen zu iterieren, Sie brauchen auch keine Importanweisungen – northsideknight

Antwort

0

Sie auch versuchen, mit der Ausnahme Anweisung verwenden können, wenn Sie in Probleme mit Listen unterschiedlicher Länge Wie laufen:

try: 
    for i, j in obt, ref: 
    # Compare lists 
except: # Enter error after except 
    # Do something else 
1

ich glaube, Sie mit zip gut wäre:

for o, r in zip(obt, ref): 
    if o <= r: 
     print ("all ok") 
    else: 
     print("error") 

Hier ist was zip(obt, ref) wird produzieren:

[(0.5, 1), (1, 2), (1.5, 3), (5, 4)] 

Und während Sie es durchlaufen, können Sie die Werte aus dem Tupel vergleichen.

0

Sie müssen andere Variablen als i und j verwenden. Diese werden durch die for-Schleife verändert. Es ist besser for x in range(len(list) für die Indexierung zu verwenden

+0

Die for-Schleife setzt die Variablen nach jeder Schleife zurück. Das ist nicht das Problem –

+0

Das stimmt, aber ich und j erhalten Werte aus der Liste und wenn Sie diese später als Index verwenden, kann dies einige Probleme wie Indexfehler verursachen. Deshalb habe ich auch vorgeschlagen –

+0

Aber sie sind keine Indizes, sie sind Werte in der Liste. Da wäre zuerst ein IndexError, weil Floats nicht als Index verwendet werden können. –

0

Python For-Schleifen sind eigentlich Foreach-Schleifen. Sie tun können,

ref =[1,2,3,4] 
obt =[0.5,1,1.5,5] 

for i in range(len(ref)): 
    if (obt[i] <= ref[i]): 
     print ("all ok") 
    else: 
     print("error") 

Die Range-Funktion durch die Zahlen 0 bis die Länge Ihres Arrays durchlaufen wird, range(len(ref)) = [0,1,2,3] Sie können dann für die in Python verwenden ist eigentlich ein foreach diese Zahlen zu greifen.

Die enumerate Funktion gibt Ihnen sowohl den Index und den Wert, so dass Sie auch

ref =[1,2,3,4] 
obt =[0.5,1,1.5,5] 

for i,r in enumerate(ref): 
    if (obt[i] <= r): 
     print ("all ok") 
    else: 
     print("error") 

Die enumerate Funktion den Index und ref[i], die in i und r gespeichert wird gibt wieder tun können. Dieses Beispiel zeigt besser, wie sich Python wie eine Foreach-Schleife und nicht wie eine For-Schleife verhält.

Der Grund für den Fehler

Auf der Linie i,j=0 haben Sie j einen Wert als auch zu geben, so würden Sie i,j=0,0 tun. Was hier passiert, ist, dass 0,0 dasselbe ist wie (0,0). Es ist ein Tupel. Das Tupel muss dann ausgepackt werden. Wenn ein Tupel entpackt wird, erhält die erste Variable i den ersten Wert 0. Die zweite Variable j erhält den zweiten Wert. Und wenn es im Tupel mehr Werte gäbe, würde dies weitergehen, bis jeder Wert im Tupel in eine Variable entpackt ist.

Sobald dies behoben ist, können wir mit der nächsten Zeile fortfahren. for i,j in obt,ref. Noch einmal, Sie werden den genau gleichen Fehler sehen. Dieses Mal erwartet Python, über etwas in Form von [(2 value tuple), (2 value tuple), (2 value tuple), (2 value tuple)] zu iterieren.

Die zip Funktion kann verwendet werden, um diese Struktur zu schaffen, wie oben vorgeschlagen wurde, oder wenn Sie es vorziehen, die Indizes in einer for-Schleife verwenden, können Sie for i in range(len(ref)) verwenden, um die Liste der Indizes [0,1,2,3] iterieren. Diese funktionieren nur, wenn ref und obt die gleiche Länge haben, ansonsten muss man zip verwenden.

Beide Wege funktionieren, mit Zip, oder die Methode, die ich erwähnte, es liegt an Ihnen, wie Sie das Problem lösen wollen. Wenn eine Liste länger als die andere ist, schneidet zip die längeren Listen ab. Die itertools.zip_longest-Lösung, die Games Braniac erwähnt, erweitert die Liste der kürzesten Länge so, dass sie dieselbe Größe haben, und reißt sie dann zusammen.

1

sollten Diese Zuordnungsanweisung nicht:

i,j=0 

dieses Versuchen Sie stattdessen:

>>> i, j = 0, 0 
>>> i 
0 
>>> j 
0 

Aber wenn man hier zwei verschiedene Listen ist vergleichen wollte, wie Sie es tun:

import itertools 
for i, j in itertools.zip_longest(list1, list2): 
    # do stuff with i and j 
    # if either i or j is none then 
    # they are not the same lengths 
+0

Die Verwendung von' i, j = 0, 0 'löst das Problem nicht vollständig. Es wirft immer noch den gleichen Fehler auf die Zeile "für i, j in obt, ref:" –

Verwandte Themen