使用while循环时的KeyError

时间:2015-06-15 17:58:49

标签: python while-loop

我对python还有点新意。最终目标是使用以下代码搜索列表并打印出列表中的每个grb.name。问题是我想要使用用户输入,我遇到的问题是,如果用户输入一个不在列表中的日期,它需要通过添加一个日期来自动纠正它,直到它到达下一个grb_date然后执行代码。这适用于start_date和end_date。

for i, grb in enumerate(results): #prolem with multiple grb's in 1 day
    try:
        grb_date = (re.sub('[A-Z]','',grb.name))
        end_results = [i, grb_date]
        data[str(grb_date)] = i  # this is the important bit
#            print (end_results)
    except:    
        pass

#start_date = (input('What is the start date you want: '))  
#end_date = (input('What is the end date you want: '))   

while 1:
    start_date = input('Please choose a start date: ')
    end_date = input('Please choose an end date now: ')
    try: 
        while data[start_date] <= data[end_date]:
                print (results[data[start_date]].name)
                data[start_date] += 1

    except KeyError:
        while data[start_date] not in end_results:
            data[start_date] += 1
        x = data[data[start_date]]
        print ('Try using this date instead: %d'), x

这就是我现在拥有的。我一直得到KeyError&#39; 111111&#39; (或者无论start_date是什么,如果它是错的)。

2 个答案:

答案 0 :(得分:0)

这应该有点明显

try: 
    while data[start_date] <= data[end_date]:
            print (results[data[start_date]].name)
            data[start_date] += 1

而且......

except KeyError:
    while data[start_date] not in end_results:

在处理密钥错误时会出现相同的密钥start_date(由同一密钥引起)。虽然EFAP很棒,但请正确使用。

您需要将start_date设置为数据。

答案 1 :(得分:0)

您收到错误,因为不正确的start_date在dict data 中不存在作为键。

将您的最后一个while循环更改为 -

while data.get('start_date', None) not in end_results:
    ....