2013-08-02 3 views
1

Я пытаюсь построить словарь, где каждый ключ имеет значение, которое является самим словарем. Проблема с помощью следующего кода, что он не добавляет новый элемент в словарь, когда новый, если это делаетсяСловарь словарей в цикле в Python

dict_features = {} 
def regexp_features(fileids): 
    for fileid in fileids: 
     if re.search(r'мерзавец|подлец', agit_corpus.raw(fileid)): 
      dict_features[fileid] = {'oskorblenie':'1'} 
     else: 
      dict_features[fileid] = {'oskorblenie':'0'} 

     if re.search(r'честны*|труд*', agit_corpus.raw(fileid)): 
      dict_features[fileid] = {'samoprezentacia':'1'} 
     else: 
      dict_features[fileid] = {'samoprezentacia':'0'} 
    return dict_features 

Результат является ДИКТ

{'neagitacia/20124211.txt': {'samoprezentacia': '0'}, 'agitacia/discreditacia1.txt': {'samoprezentacia': '0'} 

Но мне нужно

{'neagitacia/20124211.txt': {'oskorblenie':'1', 'samoprezentacia': '0'}, 'agitacia/discreditacia1.txt': {'oskorblenie':'0', 'samoprezentacia': '0'} 

ответ

1

Вы переписывая значение для того же fileid.

В коде

if re.search(r'мерзавец|подлец', agit_corpus.raw(fileid)): 
    dict_features[fileid] = {'oskorblenie':'1'} 
else: 
    dict_features[fileid] = {'oskorblenie':'0'} 

if re.search(r'честны*|труд*', agit_corpus.raw(fileid)): 
    dict_features[fileid] = {'samoprezentacia':'1'} 
else: 
    dict_features[fileid] = {'samoprezentacia':'0'} 

Для одного fileid, вы создаете первый, а затем заменить его, используя вторую if-else конструкцию. (Оба if-else конструкции поместить значения, так как либо if или else всегда будет выполняться)

Что вы будете искать это defaultdict с dict в качестве значения по умолчанию. Что-то вдоль линий -

>>> from collections import defaultdict 
>>> a = defaultdict(dict) 
>>> a['abc'] 
{} 
>>> a['abc']['def'] = 1 
>>> a 
defaultdict(<type 'dict'>, {'abc': {'def': 1}}) 
>>> a['abc']['fgh'] = 2 
>>> a 
defaultdict(<type 'dict'>, {'abc': {'fgh': 2, 'def': 1}}) 

Таким образом, ваш код может измениться на

dict_features = defaultdict(dict) 
def regexp_features(fileids): 
    for fileid in fileids: 
     if re.search(r'мерзавец|подлец', agit_corpus.raw(fileid)): 
      dict_features[fileid]['oskorblenie'] = '1' 
     else: 
      dict_features[fileid]['oskorblenie'] = '0' 

     if re.search(r'честны*|труд*', agit_corpus.raw(fileid)): 
      dict_features[fileid]['samoprezentacia'] = '1' 
     else: 
      dict_features[fileid]['samoprezentacia'] = '0' 
    return dict_features 
+0

Спасибо! Я попробовал dict_features [fileid] ['oskorblenie'] = '1', но без дефолта он произвел KeyError. Теперь это работает. –

+0

@VicNicethemer: Это то, как работают defaultdicts, поскольку для несуществующих ключей они дают значение по умолчанию для ключа, с помощью которого вы можете назначить ему материал. Рад, что мой ответ был полезен. :) –

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