如何将计数器对象转换为字典?

66

数据框:

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


2
请发布实际的回溯信息和更多上下文。 - agf
谁说“第一个参数必须是可调用的”? - joaquin
你想要什么?你能给出你想要的输出吗? - shihongzhi
@joaquin collections.defaultdict 参数 - jamylak
为何不是 collections.defaultdict(collections.Counter),而是 collections.defaultdict(collections.Counter())?之前你用的是哪个? - jamylak
@jamylak 是的,这明显是我的错。但是这段代码并不会将数据类型更改为"dict"。你有什么建议吗? - juju
5个回答

102

一个Counter已经是一个dict,或者说是它的子类。但是,如果你确实因为某些原因需要一个完全的dict,那么只需要一行代码:

>>> c = Counter(word1=4, word2=3)
>>> c
Counter({'word1': 4, 'word2': 3})
>>> dict(c)
{'word1': 4, 'word2': 3}
任何类似字典的映射(Mapping)都可以传递给dict,你将得到一个具有相同内容的dict。因此,没有必要自己迭代来构建它。
这样可以通过一个循环,在其主体中只有一行代码而不是嵌套循环。但是,任何形式的以下代码也可以:
 thing = a new empty collection
 for elem in old_thing:
    Add something to do with elem to thing

可以通常使用生成器表达式或列表、集合或字典推导式一行完成。我们正在构建一个dict,因此使用字典推导式(你最感兴趣的是示例部分)似乎是最好的选择。我会把它作为读者的练习留下来。 ;-)


2
+1 因为需要 Counter 的功能,所以只能在之后将其转换为 dict,这是唯一的方法。 - jamylak

4

由于Counter已经是一个字典,我想提供作为@lvc答案的补充建议。

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

这样可以让您添加更多的键并组合多个字典或计数器。

>>> {**c, 'total': sum(c.values())}
{'word1': 4, 'word2': 3, 'total': 7}

2

也许你正在寻找:

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

2
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

2

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 字典是你想要的。祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接