0

我正在用 python 编写一个程序,它将接受用户的生日输入并输出他们的西方和中国十二生肖。现在我只是想让中文标志工作。到目前为止,这是我的代码:

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)

我希望这段代码做的是在 ZODIAC 中的每一年中运行并找到模数为 0 的匹配项,然后返回附加的字符串。但我得到的错误是TypeError: list indices must be integers, not tuple. 我该如何解决这个问题?我应该为 ZODIAC 使用其他格式吗?

4

3 回答 3

2

你得到的例外是因为你索引列表的方式。for i in ZODIAC设置i为 ZODIAC 的成员,而不是索引。然后你不能使用ZODIAC[i]它并让它有意义。相反,i直接使用(在这种情况下,通过使用i[0]andi代替您使用的两种情况ZODIAC[i])。或者,如果您确实想迭代索引,请将循环更改为使用for i in range(len(ZODIAC)).

但是,整个问题可以简化。由于列表中的符号是有序的,因此您可以只进行一次模数计算并将其用作列表中的索引,而不是遍历列表值并测试每个值:

def getChineseZodiac(year):
    index = (year - ZODIAC[0][0]) % 12
    return ZODIAC[index]       # or ZODIAC[index][1], depending on what you want
于 2012-10-09T02:06:21.560 回答
1

for i in ZODIAC中,i 表示 ZODIAC 列表中的每个元素,即元组。如果您打印 i,您可以看到您放入列表中的每个元组。

ZODIAC[i]中,i 是一个指数,应该是整数。

您可以使用ZODIAC[i][0]获取年份(int)和ZODIAC[i][1]获取中国十二生肖。

您可以使用字典来执行此操作。

ZODIAC = { 1900:"Rat", 1901:"Ox", 1902:"Tiger", 1903:"Rabbit", ... }
def getChineseZodiac(year):
    index = 1900 + (year - 1900) % 12
    return ZODIAC[index]
于 2012-10-09T02:17:26.510 回答
0

与 JavaScript 不同,在 Python 中对序列进行迭代会产生元素,而不是位置。直接使用i而不是使用它来索引ZODIAC

>>> 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')
于 2012-10-09T02:00:11.537 回答