2017-01-26 4 views
2

Ich habe eine Liste (gordered) und ich möchte ein Element zu dieser Liste in der richtigen Reihenfolge hinzufügen. g.ordered strukturiert:Typeerror Float nicht einklagbar

# all values are floats 
g.ordered = [ 
    [[a, b, c, d...], [A]], 
    [[e, f, g, h...], [B]]... 
] 

# Where A is < B is < ... 

I

x = [[q, w, e, r...], [C]] 
# Where C can be any float 

ich geschrieben habe, hinzufügen möchten, eine Funktion, die funktionieren sollte:

def insert(x): 
    for i in range(len(g.ordered)): 

     print(g.ordered[i][1]) 
     print(x[1]) 

     if(g.ordered[i][1] > x[1]): 
      break 
     g.ordered = g.ordered[:i] + x + g.ordered[i:] 

nun der Teil verstehe ich nicht: wenn ich Fügen Sie die gedruckten Anweisungen ein, die gedruckt werden, wie ich es möchte:

>>> g.ordered[0][1] 
A 
>>> X[1] 
C 

Aber nachdem es druckt gibt es mir einen Fehler;

print(g.ordered[i][1]) 
TypeError: 'float' object is not subscriptable 

Dies ist, nachdem es die nächste Zeile bereits abgeschlossen hat.

Full Error mit Prints:

-4.882695743122578 # this is the A value 
0.01 # this is the C value 
# those where the expected prints which are in line 50 and 51 respecively 

Traceback (most recent call last): 
    File "/home/jjrreett/Genetic.py", line 57, in <module> 
    insert([[1,2,3,4,5], 0.01]) 
    File "/home/jjrreett/Genetic.py", line 50, in insert 
    print(g.ordered[i][1]) 

Typeerror: 'schweben' Objekt nicht

+2

In Zeile 49 print g.ordered [i] Wenn es ein Float ist, ist die Antwort irgendwo Sie haben einen Fehler gemacht – awiebe

Antwort

0

ist subscriptable Sie g.ordered zum Ergebnis der Berechnung einstellen, wenn man wirklich g.ordered[i] gemeint:

def insert(x): 
    for i in range(len(g.ordered)): 
     ... 
     g.ordered[i] = g.ordered[:i] + x + g.ordered[i:] 
0

Sie erstellen die Liste falsch neu.

g.ordered = g.ordered[:i] + x + g.ordered[i:] 

muss sein:

g.ordered = g.ordered[:i] + [x] + g.ordered[i:] 

Außerdem muss diese Anweisung außerhalb der Schleife sein. Allerdings würde eine robustere Lösung, um die neue Liste an das Ende g.ordered und dann neu sortieren Sie die Liste von ABC anhängen sein:

def insert(x): 
    g.ordered.append(x) 
    g.ordered = sorted(g.ordered, key=lambda x:x[1][0]) 
+0

Vielen Dank. Du warst zu 100% richtig. Das Problem bei der Neuanordnung der Liste besteht immer darin, dass es sich um eine Schleife handelt, daher möchte ich nicht, dass Zeit ein Problem darstellt. –

0
def insert(x): # you later try to subscript this float 
    for i in range(len(g.ordered)): 

     print(g.ordered[i][1]) 

     # On the following line, `x` is the float you passed in 
     # as a parameter. You can't subscript a float. 
     print(x[1]) 

     # Here again, you subscript the float `x` 
     # also, g.ordered[i][1] is a single element list `[A]` 
     # and not a value. g.ordered[i][1][0] would be `A` 
     if(g.ordered[i][1] > x[1]): 
      break 

     # This is not how you insert a value into a list. 
     # Should be g.ordered[:i] + [x] + g.ordered[i:] 
     # and not g.ordered[:i] + x + g.ordered[i:] 
     # Or, better yet, just use g.ordered.insert(i, x) 
     g.ordered = g.ordered[:i] + x + g.ordered[i:] 

sogar alles, was nach dem Fixieren Ihre Funktion wird noch nicht Tu, was du vorhast. Es fügt einen einzelnen Wert (den Parameter x) in gordered anstelle einer Struktur des Formulars [[q, w, e, r, ...], [C]] ein.

Darüber hinaus scheint die Logik, die Sie verwenden, um zu entscheiden, wo Sie einfügen möchten, nicht so, als würde es tun, was Sie erwarten.

Die DYZ-Lösung sieht so aus, als ob sie Ihr Problem recht elegant lösen sollte.

Beachten Sie jedoch, dass Sie mit seiner Lösung eine Struktur der Form [[q, w, e, r, ...], [C]] übergeben müssen und nicht nur ein Float. Basierend auf dem Fehler, den Sie erwähnt haben, scheint es, als würden Sie einen einzelnen Gleitkommawert übergeben, anstatt eine Struktur der korrekten Form. Sie brauchen also immer noch den Code, der benötigt wird, um das korrekt zu erstellen.

Verwandte Themen