我想遍历整个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
答案 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