【问题标题】:How to convert Counter object to dict?如何将 Counter 对象转换为 dict?
【发布时间】:2012-06-17 04:47:59
【问题描述】:

数据框:

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

【问题讨论】:

  • 发布实际的回溯和更多上下文。
  • WHO 说“第一个参数必须是可调用的”?
  • 你想要什么?你能给出你想要的输出吗?
  • @joaquin collections.defaultdict 参数
  • 是这条线collections.defaultdict(collections.Counter())为什么不是你之前的collections.defaultdict(collections.Counter)

标签: python dictionary


【解决方案1】:

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 由于需要Counter 的功能,它只能转换为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 字典是你想要的。祝你好运!

      【讨论】:

        【解决方案5】:

        由于 Counter 已经是一个字典。
        除了@lvc answer之外,我还想提出这个建议。

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

        【讨论】:

          猜你喜欢
          • 2015-09-15
          • 2020-03-13
          • 2018-01-08
          • 1970-01-01
          • 2021-05-31
          • 2016-05-18
          • 2017-04-27
          • 2010-11-07
          相关资源
          最近更新 更多