Как конвертировать Counter объект в dict?

Кадр данных:

pair = collections.defaultdict(collections.Counter)

например.

pair = {'doc1':  {'word1':4, 'word2':3}, 
        'doc2':  {'word1':2, 'word3':4},
        'doc3':  {'word2':2, 'word4':1},
         ...}

Я хочу сохранить фрейм данных, но изменить тип этой части {'word1':4, 'word2':3} {'word1':2, 'word3':4}``... Теперь это Counter, и мне нужен dict.

Я попробовал это, чтобы получить данные из pair, но я не знаю, как создать dict для каждого документа:

new_pair = collections.defaultdict(collections.Counter)
for doc, tab in testing.form.items():
    for word, freq in tab.items():
        new_pair[doc][word] = freq 

Я не хочу менять вывод. Мне просто нужно, чтобы в каждом документе, тип данных dict, а не Counter.

Ответ 1

A Counter уже является dict - или его подклассом. Но, если вам действительно нужна именно dict по какой-то причине, то это однострочный:

>>> c = Counter(word1=4, word2=3)
>>> c
Counter({'word1': 4, 'word2': 3})
>>> dict(c)
{'word1': 4, 'word2': 3}

Любое сопоставление (все, что ведет себя как словарь) можно передать в dict, и вы получите dict с тем же содержимым. Нет необходимости перебирать его, чтобы построить его самостоятельно.

Это дает вам один цикл с одной строкой в ​​теле вместо вложенного цикла. Но любой код формы:

 thing = a new empty collection
 for elem in old_thing:
    Add something to do with elem to thing

Обычно может выполняться в одной строке с использованием выражения генератора или списка, набора или определения dict. Мы строим dict, поэтому dict-понимание (раздел "Примеры" - это то, что вас больше всего интересует) кажется вероятным. Я оставлю его в качестве упражнения для читателя.; -)

Ответ 2

Возможно, вы ищете:

>>> from collections import defaultdict
>>> pair = defaultdict(dict)
>>> pair[3][2]='hello'
>>>
>>> pair
defaultdict(<type 'dict'>, {3: {2: 'hello'}})
>>>
>>> pair[3]
{2: 'hello'}
>>> 

Ответ 3

new_pair = {} # simple dict at the top level
for doc, tab in testing.form.items():
    for word, freq in tab.items():
        # top-level values is word counters
        new_pair[doc].setdefault(word, Counter()) += freq

Ответ 4

Counter также является dict. Но зависит от вас, может быть, следующий код вы хотите.

new_pair ={}
for doc, tab in pari.items():
    new_pair[doc] = {}
    for word, freq in tab.items():
        new_pair[doc][word] = freq

new_pair dict вы хотите. Удачи!