当我想增加对象并将其放入字典时出现KeyError

时间:2018-06-27 09:53:03

标签: python json loops dictionary key

我想遍历整个data列表并创建具有增加值的字典,其中键为userId。我有userId,并且在循环中加了1,但我收到了一个错误:KeyError: 100

todos = {}

data = [
  {
    "userId": 100,
    "id": 1,
    "title": "delectus aut autem",
    "completed": True
  },
  {
    "userId": 200,
    "id": 2,
    "title": "quis ut nam facilis et officia qui",
    "completed": True
  },
  {
    "userId": 300,
    "id": 3,
    "title": "fugiat veniam minus",
    "completed": True
  }
]

for i in data:
  todos[i['userId']] += 1 

5 个答案:

答案 0 :(得分:2)

如果您不希望在“ todos”字典中不存在该元素,我会这样更改代码:

todos = {}    
data = [
  {
    "userId": 100,
    "id": 1,
    "title": "delectus aut autem",
    "completed": True
  },
  {
    "userId": 200,
    "id": 2,
    "title": "quis ut nam facilis et officia qui",
    "completed": True
  },
  {
    "userId": 300,
    "id": 3,
    "title": "fugiat veniam minus",
    "completed": True
  }
]

for i in data:
  if i['userid'] in todos: # if key data exist in the dict, it update the value
      todos[i['userId']] += 1 
  else
     todos[i['userid']]=1 ## otherweise it create a new item with value set to 1

答案 1 :(得分:1)

使用 collections.Counter

print(Counter(x['userId'] for x in data))
# Counter({100: 1, 200: 1, 300: 1})

答案 2 :(得分:0)

字典todos为空,您正尝试使用键100(i ['userId'])在todos中查找值,但该值不存在。您需要先将条目添加到字典中,然后再尝试向其中添加条目。

答案 3 :(得分:0)

两件事:

  • i['userId']将返回值,即第一个字典的值100
  • todos是一个空字典,因此您将没有任何键。

我不确定您想做什么(计算字典的数量?userId的总和),我认为您想在这里获得userId的总和。

如果您不确定字典中将包含什么(但仍知道其值为整数),建议您使用defaultdict

from collections import defaultdict

todos = defaultdict(int)

data = [
  {
    "userId": 100,
    "id": 1,
    "title": "delectus aut autem",
    "completed": True
  },
  {
    "userId": 200,
    "id": 2,
    "title": "quis ut nam facilis et officia qui",
    "completed": True
  },
  {
    "userId": 300,
    "id": 3,
    "title": "fugiat veniam minus",
    "completed": True
  }
]

for i in data:
  todos['userId'] += i['userId']

答案 4 :(得分:0)

要改善@ jc1850的答案,请执行以下操作: 为了解决这个问题,您可以更改代码以检查密钥是否存在:

for i in data
    userid = i['userId']
    if userid not in todos: todos[userid] = 0
    todos[i['userId']] += 1

或者,您可以使用collections.defaultdict。对于int类型,如果键不存在,则假定该值为0:

from collections import defaultdict

todos = defaultdict(int)
for i in data
    todos[i['userId']] += 1