2012-06-17 3 views
12

данных:Изменить кадр данных от счетчика к Сыроватского кадр

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

Опубликовать фактическую трассировку и больше контекста. – agf

+0

ВОЗ говорит, что «первый аргумент должен быть вызываемым»? – joaquin

+0

что вам нужно? Можете ли вы дать результат, который хотите? – shihongzhi

ответ

20

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 comprehension (раздел «Примеры» вас больше всего интересует). Я оставлю его в качестве упражнения для читателя. ;-)

+1

+1 Поскольку функциональность 'Counter' необходима, ее можно преобразовать только в' dict', так что это единственный способ сделать это. – jamylak

+1

@jamylak kk. Благодарю. – juju

0

Может быть, вы ищете:

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

Не будет 'dd (dict)' работать вместо 'dd (lambda: dict())'? – DSM

+0

@ DSM, да, очевидно, моя вина. – joaquin

0
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 
0

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 вы хотите. Удачи!

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