KeyError, когда я хочу увеличить объект и поставить его на - PullRequest
0 голосов
/ 27 июня 2018

Я бы хотел перебрать весь список data и создать dict с увеличенным значением, где ключом будет 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 голосов
/ 27 июня 2018

Использование collections.Counter:

print(Counter(x['userId'] for x in data))
# Counter({100: 1, 200: 1, 300: 1})
0 голосов
/ 27 июня 2018

Чтобы улучшить ответ @ 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
0 голосов
/ 27 июня 2018

Вы пропустили вставку элемента, если его нет в словаре "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
0 голосов
/ 27 июня 2018

Две вещи:

  • 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']
0 голосов
/ 27 июня 2018

Словарные задания пустые, вы пытаетесь найти значение в заданиях с ключом 100 (i ['userId']), но его не существует. Вам нужно сначала добавить запись в словарь, прежде чем пытаться добавить ее в нее.

...