2014-02-09 17 views
27

Ich habe mir schon seit zwei Tagen den Kopf dagegen gedrückt. Ich bin neu in Python und Programmierung, also haben die anderen Beispiele dieser Art von Fehlern mir nicht viel geholfen. Ich lese durch die Dokumentation für Listen und Tupel, habe aber nichts gefunden, was hilft.Ein Zeiger wäre sehr geschätzt.Nicht die Suche nach der Antwort notwendig, nur mehr Ressourcen auf, wo Sie suchen.Ich benutze Python 2.7.6. dankPython-Listenindizes müssen Ganzzahlen sein, nicht Tupel "

measure = raw_input("How would you like to measure the coins? Enter 1 for grams 2 for pounds. ") 

coin_args = [ 
["pennies", '2.5', '50.0', '.01'] 
["nickles", '5.0', '40.0', '.05'] 
["dimes", '2.268', '50.0', '.1'] 
["quarters", '5.67', '40.0', '.25'] 
] 

if measure == 2: 
    for coin, coin_weight, rolls, worth in coin_args: 
     print "Enter the weight of your %s" % (coin) 
     weight = float(raw_input()) 
     convert2grams = weight * 453.592 

     num_coin = convert2grams/(float(coin_weight)) 
     num_roll = round(num_coin/(float(rolls))) 
     amount = round(num_coin * (float(worth)), 2) 

     print "You have %d %s, worth $ %d, and will need %d rolls." % (num_coin, coin, amount, num_roll) 

else: 
    for coin, coin_weight, rolls, worth in coin_args: 
     print "Enter the weight of your %s" % (coin) 
     weight = float(raw_input()) 

     num_coin = weight/(float(coin_weight)) 
     num_roll = round(num_coin/(float(rolls))) 
     amount = round(num_coin * (float(worth)), 2) 

     print "You have %d %s, worth $ %d, and will need %d rolls." % (num_coin, coin, amount, num_roll) 

Dies ist der Stack-Trace:

File ".\coin_estimator_by_weight.py", line 5, in <module> 
    ["nickles", '5.0', '40.0', '.05'] 
TypeError: list indices must be integers, not tuple 
+2

Sie das Ergebnis nicht von 'raw_input' analysieren. Es wird niemals '2' sein. –

+1

Da du mehr oder weniger den gleichen Quellcode zweimal geschrieben hast, solltest du dir überlegen, wie du das eleganter machen kannst. In der Tat müssen Sie die Gewichtseinheit unterscheiden, die Eingabe bei Bedarf konvertieren, und der Rest ist der gleiche. – OBu

+0

OBu ein sehr guter Punkt. Ich werde daran arbeiten, meinen Code zu verfeinern. Ich gehe davon aus, dass Sie über eine Funktion sprechen. – Aaron

Antwort

46

Das Problem ist, dass [...] in Python zwei verschiedene Bedeutungen

  1. expr [ index ] bedeutet den Zugriff auf ein Element einer Liste
  2. hat [ expr1, expr2, expr3 ] bedeutet das Erstellen einer Liste von drei Elementen aus drei Ausdrücken

In Ihrem Code haben Sie vergessen, die Kommunikation ein zwischen den Ausdrücken für die Elemente in der äußeren Liste:

[ [a, b, c] [d, e, f] [g, h, i] ] 

daher interpretiert Python den Beginn des zweiten Elements als ein Index auf die erste aufgebracht werden und das ist, was die Fehlermeldung sagt.

Die korrekte Syntax für das, was Sie suchen ist

[ [a, b, c], [d, e, f], [g, h, i] ] 
+3

Ich weiß es zu schätzen, dass Sie das Warum erklärt haben, das hinter dem Fehler steht, den ich bekommen habe. – Aaron

10

zu erstellen Liste von Listen, müssen Sie sie mit Kommas trennen, wie diese

coin_args = [ 
    ["pennies", '2.5', '50.0', '.01'], 
    ["nickles", '5.0', '40.0', '.05'], 
    ["dimes", '2.268', '50.0', '.1'], 
    ["quarters", '5.67', '40.0', '.25'] 
] 
6

Warum die Fehler Erwähnung Tupeln?

Andere haben erklärt, dass das Problem die fehlende , war, aber das letzte Geheimnis ist, warum die Fehlermeldung über Tupel sprechen?

Der Grund dafür ist, dass Ihr:

["pennies", '2.5', '50.0', '.01'] 
["nickles", '5.0', '40.0', '.05'] 

kann reduziert werden:

[][1, 2] 

als mentioned by 6502 mit dem gleichen Fehler.

Aber dann __getitem__, die mit [] Auflösung befasst, wandelt object[1, 2] in ein Tupel:

class C(object): 
    def __getitem__(self, k): 
     return k 

# Single argument is passed directly. 
assert C()[0] == 0 

# Multiple indices generate a tuple. 
assert C()[0, 1] == (0, 1) 

und die Umsetzung von __getitem__ für die Liste integrierten Klasse kann nicht mit Tupel Argumente wie damit umgehen.

Ich empfehle auch, dass Sie minimal Beispiele in Zukunft :-)

Weitere Beispiele für __getitem__ Aktion bei herzustellen versuchen: https://stackoverflow.com/a/33086813/895245

Verwandte Themen