如何解决TypeError:' int'对象没有属性' __ getitem __'?

时间:2017-09-04 12:23:38

标签: python python-2.7

我编写了以下代码,但它在第TypeError: 'int' object has no attribute '__getitem__'行失败并显示错误消息if date(dt.year,start[0],start[1]) <= dt.date() <= date(dt.year,end[0],end[1]):。使用json_string

获取对象json_string = json.loads(text)
def getField(dt,json_string):

    fields = {k['type']: ((k['start-month'],k['start-day']),(k['end-month'],k['end-day'])) for k in json_string}

    field = "NA"    
    for t, ranges in fields.items():
        for start, end in ranges:
            if date(dt.year,start[0],start[1]) <= dt.date() <= date(dt.year,end[0],end[1]):
                field = t
                break
        if field != "NA":
            break
    return field 

text = '''[{"end-day":31,"end-month":5,"type":"T1","start-day":10,"start-month":1},{"end-day":9,"end-month":1,"type":"T2","start-day":1,"start-month":9},{"end-day":30,"end-month":9,"type":"T3","start-day":1,"start-month":6}]'''

json_string = json.loads(text)
dt = datetime.strptime("2015-03-12 11:00:00.0", "%Y-%m-%d %H:%M:%S.%f")

getField(dt,json_string)

更新

fields的内容:

{u'Type1': ((6, 1), (9, 30)),
 u'Type2': ((1, 10), (5, 31)),
 u'Type3': ((9, 1), (1, 9))}

2 个答案:

答案 0 :(得分:2)

由此:

if date(dt.year,start[0],start[1]) 
很明显,您期望start成为包含月和日的元组。但如果我这样做:

for t, ranges in fields.items():
    for start, end in ranges:
        print (f"start={start} end={end}")

我明白了:

start=6 end=1
start=9 end=30
start=1 end=10
start=5 end=31
start=9 end=1
start=1 end=9

现在您可以看到错误消息的来源。 start[0]表示6[0]。这样做:

for t, (start,end) in fields.items():

然后startend将是您期望的月/日元组。

答案 1 :(得分:1)

你应该做的是

start, end = ranges

而不是循环遍历它们。另外,ranges不是一个好名字,像date_pairs这样的东西可能更有意义。

ranges中你所拥有的是一系列对(其中2对,确切地说)。因此for循环将迭代两次 - 一次用于表示开始日期的一对整数,一次用于表示结束日期的一对整数。在每次迭代中,startend将是整数,而不是对,因此您无法对其进行索引。