2013-12-05 2 views
0

Я пытаюсь создать вложенный словарь из запроса тузды, но я получаю ошибку клавишногопитона генераторного вложенного словарь ошибки ключа

result = {} 

for i, q in enumerate(query): 

    result['data'][i]['firstName'] = q.first_name 
    result['data'][i]['lastName'] = q.last_name 
    result['data'][i]['email'] = q.email 

ошибка

KeyError: 'data' 

желаемый результату

result = { 
    'data': { 
     0: {'firstName': ''...} 
     1: {'firstName': ''...} 
     2: {'firstName': ''...} 
    } 
} 
+0

вы хотите ключи быть целыми числами от 0 до 'LEN (результат)'? почему бы не использовать список? – jpwagner

+0

Почему вы используете '' data'', если вы не хотите иметь его в 'result'? –

+1

Вы должны искать словари в документах. – keyser

ответ

0

result['data'] есть. Поэтому вы не можете добавлять к нему данные.

Попробовать это на старте:

result = {'data': []}; 
0

Вы должны создать ключ data первый:

result = {} 
result['data'] = {} 

for i, q in enumerate(query): 
    result['data'][i] = {} 
    result['data'][i]['firstName'] = q.first_name 
    result['data'][i]['lastName'] = q.last_name 
    result['data'][i]['email'] = q.email 
+0

Я думаю, что 'result ['data'] ['i'] = {}' должен быть 'result [ 'data'] [i] = {} ' – SethMMorton

+0

@SethMMorton Конечно. – Hyperboreus

0
result = {} 
result['data'] = {} 

for i, q in enumerate(query): 
    result['data']['i'] = {} 
    result['data'][i]['firstName'] = q.first_name 
    result['data'][i]['lastName'] = q.last_name 
    result['data'][i]['email'] = q.email 

В качестве альтернативы, вы можете использовать вас есть класс, который добавляет дополнительную dicts автоматически

class AutoDict(dict): 
    def __missing__(self, k): 
     self[k] = AutoDict() 
     return self[k] 

result = AutoDict() 

for i, q in enumerate(query): 
    result['data'][i]['firstName'] = q.first_name 
    result['data'][i]['lastName'] = q.last_name 
    result['data'][i]['email'] = q.email 
2

Вы хотите создать вложенный словарь

результат = {} создает задание для плоского словаря, чьи элементы могут иметь любые значения, как «строка», «Int», «список» или «Словарь»

для этого плоской уступки

питона знает, что делать для результата [ «первого»]

Если вы хотите «первым» также будут другой словарь вам нужно сказать Python с помощью assingment результата [ «первого» знак равно

иначе, Python поднимает "исключение KeyError"

Я думаю, что вы ищете это :)

>>> from collections import defaultdict 
>>> mydict = lambda: defaultdict(mydict) 
>>> result = mydict() 
>>> result['Python']['rules']['the world'] = "Yes I Agree" 
>>> result['Python']['rules']['the world'] 
'Yes I Agree' 
Смежные вопросы