JSON迭代器类

时间:2013-07-05 22:29:12

标签: python oop iterator

我正在尝试创建一个自定义迭代器类来运行用户数据的JSON文件。

class trainUsers():
    def __getitem__(self, num):
        with open(file.json') as f:
            #if num > 43873:
             #   raise IndexError("end of file")
            train_user = [json.loads(line) for line in f]
        return train_user[num]
    def rating(self,num):
        return self[num]['rating']
    def id(self,num):
        return self[num]['user_id']

然后我可以通过

访问每个用户
trainuser = data.trainUsers()

trainuser[num] #returns a dict
trainuser.rating(num)

但是,我遇到了迭代问题。

count = 0
rating = 0
for i in trainuser:
    rating += trainuser.rating(i)
    count += 1
print stars/ count

IndexError被注释掉,因为它总是被调用,我认为文档说for循环需要IndexError才能运行。以上从 getitem 函数中给出了以下错误。

@return train_user[num]
TypeError: list indices must be integers, not dict

我得到的是trainuser返回字典,但我无法概念化for循环使用字典迭代的原因。

如何让这个类重复并单独调用每个字典?

1 个答案:

答案 0 :(得分:0)

这是因为你的'for'循环将json文件中的每个项目都返回为'i'而不是for循环索引。

python中'for'循环的一个例子

>>> arr = ['hip','hello','hey']
>>> for i in arr:
>>>    print i
hip
hello
hey

在你的情况下,这应该有效:

>>> rating = 0
>>> for i in trainuser:
>>>     rating += trainuser['rating']
>>>
>>> print stars/ len(trainuser)

或者,如果您希望通过索引保留在json文件中查找行的方法,则可以使用枚举:

>>> rating = 0
>>> for index, i in enumerate(trainuser):
>>>     rating += trainuser.rating(index)
>>>
>>> print stars/ len(trainuser)