2012-06-20 2 views
0

Что мне недостает? Я с Dict из dicts (который был создан на лету), как это:Добавочный список в dict dict

googlers = 3 
goog_dict = {} 
dict_within = {'score':[], 'surprise':''} 
for i in xrange(googlers): 
    name = "goog_%s" %i 
    goog_dict[name] = dict_within 

Теперь я хочу добавить некоторые данные:

tot =[23,22,21] 
best_res = 8 


for i in xrange(len(tot)): 

    name = "goog_%s" %i 
    print name 
    rest = tot[i] - best_res 
    if rest % 2 == 0: 
     trip = [best_res, rest/2, rest/2] 

    elif rest % 2 != 0: 
     rest_odd = rest/2 
     fract_odd = rest - rest_odd 
     trip = [best_res, rest_odd, fract_odd] 

    if (max(trip) - min(trip)) == 2: 
     surpr_state = True 
    elif (max(trip) - min(trip)) < 2: 
     surpr_state = False 

    goog_dict[name]['score'].append(trip) 
    goog_dict[name]['surprise'] = surpr_state 

Я бы ожидать, мой выход будет:

{'goog_2': {'surprise': True, 'score': [8, 7, 8]}, 'goog_1':{'surprise': True, 'score': [8, 7, 7]}, 'goog_0': {'surprise': True, 'score': [8, 6, 7]}} 

Но то, что я получаю это:

{'goog_2': {'surprise': True, 'score': [[8, 7, 8], [8, 7, 7], [8, 6, 7]]}, 'goog_1':{'surprise': True, 'score': [[8, 7, 8], [8, 7, 7], [8, 6, 7]]}, 'goog_0': {'surprise': True, 'score': [[8, 7, 8], [8, 7, 7], [8, 6, 7]]}} 

Так почему же список trip append to все dicts вместо одного только с текущим name?

+1

Пожалуйста, покажите фактический результат фактического кода. http://sscce.org/ – Marcin

+0

И в значениях примера предпочитайте фактический синтаксис Python вместо некоторого приближения. –

ответ

3

EDIT:

Как я уже догадался. Каждый элемент вашего goog_dict является одним и тем же элементом. Прочтите немного об отношениях, поскольку это может быть действительно полезно.

Изменить код в:

goog_dict = {} 
googlers = 3 
for i in xrange(googlers): 
    name = "goog_%s" %i 
    dict_within = {'score':[], 'surprise':''} 
    goog_dict[name] = dict_within 

И теперь это должно быть в порядке.

Также взгляните на этот пример. Это точно, что произошло в вашем случае.

>>> a = [] 
>>> goog_dict = {} 
>>> goog_dict['1'] = a 
>>> goog_dict['2'] = a 
>>> goog_dict['3'] = a 
>>> goog_dict 
{'1': [], '3': [], '2': []} 
>>> goog_dict['1'].append([1, 2, 3]) 
>>> goog_dict 
{'1': [[1, 2, 3]], '3': [[1, 2, 3]], '2': [[1, 2, 3]]} 

Это довольно распространенная ошибка.

+0

Возможно, я был недостаточно ясен. Я просто хочу добавить список 'trip'. Но отображение не работает, как ожидалось, потому что все dicts внутри dict добавляются к каждому запуску цикла (!). Поэтому вызов 'goog_dict [name] ['score']' не заставляет ** только ** обновлять 'goog_dict [name]'. – LarsVegas

+0

Я понимаю. См. Также мой комментарий к ответу лазира. Не повторю эту ошибку, я думаю ;-) Нельзя забывать, что все в Python - это объект ... – LarsVegas

2

Попробуйте это:

googlers = 3 
goog_dict = {} 
for i in xrange(googlers): 
    name = "goog_%s" %i 
    goog_dict[name] = {'score':[], 'surprise':''} 

Значение "score" в Словаре указал на же списке везде, следовательно, эффект, который вы видели. Попытайтесь вставить свой код для построения кода в this python code visualizer, чтобы узнать, что произойдет.

+0

Действительно, это нормально работает. Теперь, поскольку я думаю, что это имеет смысл. Но я думаю, вам действительно нужно знать, как код работает внутри, чтобы заранее рассмотреть это. Однако визуализатор кода - довольно классный инструмент. Благодаря! – LarsVegas

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