列表超出范围为什么?

时间:2017-10-03 17:26:54

标签: python

每当我输入1时,它会说列表索引超出范围 我最后放了一个if语句,说明输入是1月打印1 如何使用第一个if语句

使这个程序工作
months= ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]
months_nums=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
user_input= int(input("Enter month: "))
while user_input != 0:
    for i in months_nums:
        if user_input == months_nums[i]:
            print(months[i])
            break
    user_input= int(input("Enter months: "))

5 个答案:

答案 0 :(得分:1)

如果您只是想根据持续提示的用户输入打印月份名称,为什么不使用它呢?

user_input= int(input("Enter month: "))

while user_input != 0:
    print(months[user_input-1])
    user_input= int(input("Enter months: "))

这利用了数组month中的顺序 - 该数组中的月份名称索引只是输入数字-1。

你的循环不起作用的原因实际上是一个小而不是那个可见的错误。 for i in months_nums:表示你实际上是在获取months_nums的元素,而不是索引。换句话说,i = 1,2,3,..,12不是0,1,2,..11

在寻找1月时,您会要求找到第一个从未找到过的元素,因为i中的months_nums[i]将永远不会有值0,并且会获取您的月号1。另一方面它最终将达到值12,而month_nums的最后一个索引是11 - 这是它抛出错误的时间。

您可以使用i作为实际的元素来解决原始循环中的此问题,而不是if语句中的索引:

user_input= int(input("Enter month: "))
while user_input != 0:
    for i in months_nums:
        if user_input == i:
            print(months[i-1])
            break
    user_input= int(input("Enter months: "))

这个仍然利用months中的排序,因此打印的值的索引为i-1

答案 1 :(得分:0)

问题与迭代索引和检查用户输入是否与month_num列表中的月份相匹配的方式有关。

if user_input == months_nums[i]无法正常工作,因为如果用户输入1个月,February会导致列表从0开始计算。

相反,您应该执行以下操作:

months= ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]
months_nums=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

options = dict(zip(months_num, months))

user_input= int(input("Enter month: "))

try:
    print(options[user_input])
except KeyError as e:
    print(e)

答案 2 :(得分:0)

months= ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]
months_nums=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
user_input= int(input("Enter month: "))
while user_input != 0:
    if user_input in months_nums:
        print(months[user_input-1])
        break
    user_input= int(input("Enter months: "))

答案 3 :(得分:0)

Given that I have a s3 bucket called "mybucket"
And I have a docker container called "myfileserver"
And I have another docker container called "s3cli" with s3 cli commands
And I am on "s3cli" 
when I try to copy files from "mybucket" to "myfileserver"
Then I get confused how to do so?

答案 4 :(得分:0)

而不是创建列表,为什么不使用日期时间库:

import datetime

user_input = int(input("Enter month: "))

while user_input != 0: 
    month = datetime.datetime.strptime(str(user_input),"%m")
    print(month.strftime("%B"))
    user_input= int(input("Enter months: "))

基本上你可以阅读更多关于以特定方式打印日期时间对象的strftime: datetime.strftime("%B")给出月份。你还需要strptime从字符串中读取日期,例如datetime.strptime(" 31/12 / 1999","%d /%m /%Y"),在这种情况下我们只需阅读月份。

但是,我可能会检查输入是否为整数,然后检查它是否在1-12范围内,如果没有退出。这样的事情:

import datetime

# Start a loop
while True:

    # Ask for a number until you get one
    while True:
        user_input= input("Enter months: ")
        try:
            user_input = int(user_input)
            break
        except ValueError:
            print("you must enter an integer")

    # Break if user input not in range
    if user_input not in range(1,12):
        break

    # Get current month    
    month = datetime.datetime.strptime(str(user_input),"%m")

    # Print
    print(month.strftime("%B"))