2015-01-20 5 views
9

Die interpretiert wird playSound Funktion eine Liste von ganzen Zahlen nimmt, und wird einen Sound für jede andere Zahl spielen. Wenn also eine der Nummern in der Liste 1 ist, hat 1 einen bestimmten Sound, der wiedergegeben wird.Typeerror: ‚list‘ Objekt kann nicht als eine ganze Zahl

def userNum(iterations): 
    myList = [] 
    for i in range(iterations): 
    a = int(input("Enter a number for sound: ")) 
    myList.append(a) 
    return myList 
    print(myList) 

def playSound(myList): 
    for i in range(myList): 
    if i == 1: 
     winsound.PlaySound("SystemExit", winsound.SND_ALIAS) 

Ich erhalte diese Fehlermeldung:

TypeError: 'list' object cannot be interpreted as an integer 

Ich habe versucht, ein paar Möglichkeiten, die Liste auf ganze Zahlen zu konvertieren. Ich bin mir nicht sicher, was ich ändern muss. Ich bin mir sicher, dass es einen effizienteren Weg dafür gibt. Jede Hilfe würde sehr geschätzt werden.

Antwort

2

Sie sollten diese stattdessen tun:

for i in myList: 
    # etc. 

Das heißt, entfernen Sie den range() Teil. Die range()-Funktion wird verwendet, um eine Folge von Zahlen zu generieren, und sie empfängt als Parameter die Grenzen, um den Bereich zu generieren. Es wird nicht funktionieren, eine Liste als Parameter zu übergeben. Um über die Liste zu iterieren, schreiben Sie einfach die Schleife wie oben gezeigt.

2

range ist ein Integer-Argument erwartet, von dem es eine Reihe von ganzen Zahlen bauen:

>>> range(10) 
range(0, 10) 
>>> list(range(10)) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> 

Darüber hinaus ist es eine Liste gibt einen TypeError weil range nicht wissen, erhöhen, wie es zu handhaben:

>>> range([1, 2, 3]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'list' object cannot be interpreted as an integer 
>>> 

Wenn Sie die Einzelteile in myList, Schleife über die Liste zugreifen möchten direkt:

for i in myList: 
    ... 

Demo:

>>> myList = [1, 2, 3] 
>>> for i in myList: 
...  print(i) 
... 
1 
2 
3 
>>> 
1

In playSound() statt

for i in range(myList): 

versuchen

for i in myList: 

Diese über den Inhalt myList laufen wird, die meiner Meinung nach ist das, was Sie wollen. range(myList) macht keinen Sinn.

1

Der Fehler hieraus ist:

def playSound(myList): 
    for i in range(myList): # <= myList is a list, not an integer 

Sie keine Liste zu range passieren kann, die eine ganze Zahl erwartet.Wahrscheinlich bedeutete Sie zu tun:

def playSound(myList): 
    for list_item in myList: 

ODER

def playSound(myList): 
    for i in range(len(myList)): 

ODER

def playSound(myList): 
    for i, list_item in enumerate(myList): 
2

die range entfernen.

for i in myList 

Bereich nimmt eine ganze Zahl. Sie möchten für jedes Element in der Liste.

1
def userNum(iterations): 
    myList = [] 
    for i in range(iterations): 
     a = int(input("Enter a number for sound: ")) 
     myList.append(a) 
    print(myList) # print before return 
    return myList # return outside of loop 

def playSound(myList): 
    for i in range(len(myList)): # range takes int not list 
     if i == 1: 
      winsound.PlaySound("SystemExit", winsound.SND_ALIAS) 
9

Fehlermeldungen bedeuten in der Regel genau, was sie sagen. Sie müssen also sehr sorgfältig gelesen werden. Wenn Sie das tun, werden Sie sehen, dass dieser sich nicht wirklich beschweren wird, wie Sie anscheinend angenommen haben, welche Art von Objekt Ihre Liste enthält, sondern eher, welche Art von Objekt es ist. Es heißt nicht, dass Ihre Liste Ganzzahlen (Plural) enthalten soll. Stattdessen scheint es, dass Ihre Liste eine Ganzzahl (Einzahl) sein soll, anstatt eine Liste von irgendetwas. Und da Sie eine Liste nicht in eine ganze Zahl umwandeln können (zumindest nicht in einer Weise, die in diesem Zusammenhang sinnvoll ist), sollten Sie nicht versuchen.

Die Frage ist also: Warum scheint der Interpreter Ihre Liste als Integer zu interpretieren? Die Antwort ist, dass Sie Ihre Liste als Eingabeargument an range übergeben, die eine ganze Zahl erwartet. Tu das nicht. Sagen Sie stattdessen for i in myList.

+1

oder 'für i in range (len (myList))' wenn ich über Indizes statt über Elemente selbst iterieren möchte. – 3yakuya

+2

oder 'für Index, Element in Enumerate (myList)', um Sie beide, IMO lesbarer zu bekommen – jez

Verwandte Themen