Ich schreibe ein Programm in Python, das die Eingabe zum Geburtstag des Benutzers und die Ausgabe seines westlichen und chinesischen Sternzeichens übernimmt. Im Moment versuche ich nur, das chinesische Zeichen zum Laufen zu bringen. Dies ist mein bisheriger Code:

ZODIAC = [(1900, "Rat"), (1901, "Ox"), (1902, "Tiger"), (1903, "Rabbit"), (1904\
, "Dragon"), (1905, "Snake"), (1906, "Horse"), (1907, "Sheep"), (1908, "Monkey"\
), (1909, "Rooster"), (1910, "Dog"), (1911, "Pig")]

def getChineseZodiac(year):
    for i in ZODIAC:
        if (year - ZODIAC[i]) % 12 == 0:
            return ZODIAC[i]

year = input("Enter a year: ")
getChineseZodiac(year)

Ich hoffe, dass dieser Code jedes dieser Jahre in ZODIAC durchläuft, eine Übereinstimmung mit Modul 0 findet und dann die angehängte Zeichenfolge zurückgibt. Aber der Fehler, den ich bekomme, ist TypeError: list indices must be integers, not tuple. Wie löse ich das? Soll ich ein anderes Format für ZODIAC verwenden?

0
crackhamster 9 Okt. 2012 im 05:57

3 Antworten

Beste Antwort

Die Ausnahme, die Sie erhalten, ist die Art und Weise, wie Sie die Liste indizieren. for i in ZODIAC setzt i auf ein Mitglied von ZODIAC, nicht auf einen Index. Sie können dann ZODIAC[i] nicht verwenden und es sinnvoll machen. Verwenden Sie stattdessen i direkt (in diesem Fall i[0] und i anstelle der beiden Fälle, in denen Sie ZODIAC[i] verwendet haben). Wenn Sie alternativ über Indizes iterieren möchten, ändern Sie alternativ Ihre Schleife in for i in range(len(ZODIAC)).

Das ganze Problem kann jedoch vereinfacht werden. Da die Vorzeichen in Ihrer Liste in Ordnung sind, können Sie nur eine einzige Modulberechnung durchführen und diese als Index für die Liste verwenden, anstatt die Listenwerte zu durchlaufen und jeden einzelnen zu testen:

def getChineseZodiac(year):
    index = (year - ZODIAC[0][0]) % 12
    return ZODIAC[index]       # or ZODIAC[index][1], depending on what you want
2
Blckknght 9 Okt. 2012 im 02:12

Im Gegensatz zu JavaScript liefert das Durchlaufen einer Sequenz in Python Elemente und keine Positionen. Verwenden Sie i direkt, anstatt ZODIAC zu indizieren.

>>> for i in ZODIAC:
...   print i
... 
(1900, 'Rat')
(1901, 'Ox')
(1902, 'Tiger')
(1903, 'Rabbit')
(1904, 'Dragon')
(1905, 'Snake')
(1906, 'Horse')
(1907, 'Sheep')
(1908, 'Monkey')
(1909, 'Rooster')
(1910, 'Dog')
(1911, 'Pig')
0
Ignacio Vazquez-Abrams 9 Okt. 2012 im 02:00

In for i in ZODIAC repräsentiert i jedes Element in der Liste ZODIAC, das Tupel ist. Wenn Sie i drucken, können Sie jedes Tupel sehen, das Sie in die Liste aufgenommen haben.

In ZODIAC[i] ist i ein Index, der eine ganze Zahl sein sollte.

Sie können ZODIAC[i][0] verwenden, um das Jahr (int) zu erhalten, und ZODIAC[i][1], um das chinesische Sternzeichen zu erhalten.

Sie können dazu ein Wörterbuch verwenden.

ZODIAC = { 1900:"Rat", 1901:"Ox", 1902:"Tiger", 1903:"Rabbit", ... }
def getChineseZodiac(year):
    index = 1900 + (year - 1900) % 12
    return ZODIAC[index]
1
shirley 9 Okt. 2012 im 02:22