2014-11-05 2 views
1

Я попытался создать идеальный словарь для моих нужд (dict, который содержит dict со значениями и списком). Однако кажется, что я снова и снова использовал одну и ту же ссылку.Передает ли dict.fromkey одну и ту же ссылку снова и снова?

brands = ['val1', 'val2', 'val3'] 
infoBrands = dict.fromkeys(brands, 
       dict(dict.fromkeys(['nbOffers', 'nbBestOffers'], 0), 
        **dict.fromkeys(['higherPrice'], []))) 

infoBrands['val1']['nbOffers'] += 1 
print infoBrands 

Вот результаты:

{'val3': 
    {'higherPrice': [], 
     'nbOffers': 1, 
     'nbBestOffers': 0}, 
    'val2': 
     {'higherPrice': [], 
     'nbOffers': 1, 
     'nbBestOffers': 0}, 
    'val1': 
     {'higherPrice': [], 
     'nbOffers': 1, 
     'nbBestOffers': 0} 
} 

Как вы можете видеть, val1, val2 и val3 относитесь к тому же Словарю. Я не уверен, как мне с этим справиться? Любые советы?

+2

'dict.fromkeys' использует одно и то же значение для каждого ключа, следовательно, эталонная проблема. Вы вообще изучали 'collections.defaultdict'? (См. Например, http://bugs.python.org/issue6730) – jonrsharpe

+0

Привет, я благодарю вас за отзыв. я сразу посмотрю на это –

+2

Или вы можете использовать понимание dict: http://stackoverflow.com/questions/15516413/dict-fromkeys-all-point-to-same-list –

ответ

2

Такого рода вещи обычно делается с dictionary comprehensions, а не dict.fromkeys():

brands = ['val1', 'val2', 'val3'] 
infoBrands = {brand: {'nbOffers': 0, 'nbBestOffers': 0, 'higherPrice': []} 
       for brand in brands} 

infoBrands['val1']['nbOffers'] += 1 
print infoBrands 

Выход:

{'val3': {'higherPrice': [], 'nbOffers': 0, 'nbBestOffers': 0}, 
'val2': {'higherPrice': [], 'nbOffers': 0, 'nbBestOffers': 0}, 
'val1': {'higherPrice': [], 'nbOffers': 1, 'nbBestOffers': 0}} 
+0

Спасибо, это действительно чисто. –

0
brands = ['val1', 'val2', 'val3'] 
init = dict(higher_price=[], nb_offers=0, nb_best_offers=0) 
info = {brand: dict(init) for brand in brands} 
+0

Это сделает отдельные словари, но они будут делиться 'higher_price 'списки, например 'info [" val1 "] [" higher_price "] - это информация [" val2 "] [" higher_price "]'. – DSM

0

Спасибо всем,

EDIT: посмотреть на @martineau ответ

я сделал следующие:

brands = ['val1', 'val2', 'val3'] 
infoBrands = dict.fromkeys(brands) 

for brand in brands: 
    infoBrands[brand] = dict([('nbOffers', 0), ('nbBestOffers', 0), ('higherPrice', [])])                                      

infoBrands['val1']['nbOffers'] = 1 
print infoBrands 

Результаты:

{ 'val3' : {'higherPrice': [], 'nbOffers': 0, 'nbBestOffers': 0}, 'val2': {'higherPrice': [], 'nbOffers': 0, 'nbBestOffers': 0}, 'val1': {'higherPrice': [], 'nbOffers': 1, 'nbBestOffers': 0 }}

1

Вот еще один способ достижения требуемого результата с помощью dict comprehension:

brands = ['val1', 'val2', 'val3'] 
infoBrands = {g: dict({i: 0 for i in ['nbOffers', 'nbBestOffers']}, 
         **{j: [] for j in ['higherPrice']}) for g in brands} 

infoBrands['val1']['nbOffers'] += 1 
print infoBrands 
Смежные вопросы