我正在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使用其他格式吗?
答案 0 :(得分:2)
您获得的异常是因为您为列表编制索引的方式。 for i in ZODIAC
将i
设置为ZODIAC的成员,而不是索引。然后你不能使用ZODIAC[i]
并让它有意义。相反,请直接使用i
(在这种情况下,使用i[0]
和i
代替您使用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
答案 1 :(得分:1)
在for i in ZODIAC
中,i表示列表ZODIAC中的每个元素,即元组。如果你打印i,你可以看到你放在列表中的每个元组。
在ZODIAC[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]
答案 2 :(得分: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')