2014-01-15 2 views
1

Вот мой код:Добавить несколько значений в словарь

for response in responses["result"]: 
    ids = {} 
    key = response['_id'].encode('ascii') 
    print key 
    for value in response['docs']: 
     ids[key].append(value) 

Traceback:

File "people.py", line 47, in <module> 
    ids[key].append(value) 
    KeyError: 'deanna' 

Я пытаюсь добавить несколько значений ключа. Выдает ошибку, как выше

ответ

3

Выезд setdefault:

ids.setdefault(key, []).append(value) 

Он смотрит, чтобы увидеть, если key в ids, а если нет, устанавливает, что пустой список. Затем он возвращает этот список для встроенного вызова append.

Docs: http://docs.python.org/2/library/stdtypes.html#dict.setdefault

+0

Как пройти этот словарь, чтобы проверить, правильно ли оно добавлено? – blackmamba

+1

Это будет совсем другой вопрос, но вы можете перебирать его в цикле for, например 'for key, value in ids.items():' – mhlester

1

Если я правильно читать это ваше намерение состоит в том, чтобы сопоставить _id в ответ на его документы. В этом случае вы можете принести вниз все, что вы выше к dict comprehension:

ids = {response['_id'].encode('ascii'): response['docs'] 
     for response in responses['result']} 

Это также предполагает, вы имели в виду, чтобы иметь id = {} вне внешней петли, но я не вижу никакой другой разумной интерпретации.


Если выше не является правильным,

Вы можете использовать collections.defaultdict

import collections # at top level 

#then in your loop: 

ids = collections.defaultdict(list) #instead of ids = {} 

словарь, значение которого по умолчанию будет создана путем вызова инициализации аргумента, в этом случае вызова list() будет производить пустой список, к которому можно добавить.

Для перемещения словаря вы можете итерации по его items()

for key, val in ids.items(): 
    print(key, val) 
0

Причиной, побуждающей вы получаете исключение KeyError заключается в следующем: В первой итерации ваш цикл, вы посмотрите вверх ключ в пустом словаре , Нет такого ключа, следовательно, KeyError.

Код, который вы указали, будет работать, если вы сначала введете пустой список в словарь под соответствующим ключом. Затем добавьте значения в список. Например:

for response in responses["result"]: 
ids = {} 
key = response['_id'].encode('ascii') 
print key 
if key not in ids: ## <-- if we haven't seen key yet 
    ids[key] = []  ## <-- insert an empty list into the dictionary 
for value in response['docs']: 
    ids[key].append(value) 

Предыдущие ответы верны. И defaultdict, и dictionary.setdefault - это автоматические способы вставки пустого списка.

Смежные вопросы