【问题标题】:Most effective way to group element counter in Python在 Python 中对元素计数器进行分组的最有效方法
【发布时间】:2014-05-29 15:22:01
【问题描述】:

假设我有一个这样的列表/元组:['a', 'b', 'c', 'a', 'b', 'b', 'c']

Frequency of 'a': 2
Frequency of 'b': 3
Frequency of 'c': 2

现在我想按这些频率对它们进行分组,预期输出:{2: ['a', 'c'], 3: ['b']} 或任何其他我可以轻松获得频率及其项目的东西。

我怎样才能以最有效的方式做到这一点?

【问题讨论】:

    标签: python algorithm counter frequency


    【解决方案1】:

    您可以将collections.Countercollections.defaultdict 一起使用

    >>> from collections import Counter, defaultdict
    >>> l = ['a', 'b', 'c', 'a', 'b', 'b', 'c']
    >>> 
    >>> counts = Counter(l)
    >>> freqs = defaultdict(list)
    >>> 
    >>> for k,v in counts.items():
    ...     freqs[v].append(k)
    ... 
    >>> freqs
    defaultdict(<type 'list'>, {2: ['a', 'c'], 3: ['b']})
    

    【讨论】:

    • for k, count in counts.items():freqs[count].append(k) 通过稍微更好的命名使其更清晰(当然是主观的)。
    • 正是我想要的。我会注意到 Python 中的 collections 包。
    • @Tommy 很高兴我能帮上忙。如果对您有用,请考虑accepting 这个答案。
    • @arshajii:是的,当然。我会,但不是现在,因为我得等几分钟。 :)
    【解决方案2】:

    使用collections.Counteritertools.groupby

    >>> from collections import Counter
    >>> from itertools import groupby
    >>>
    >>> freq = Counter(['a', 'b', 'c', 'a', 'b', 'b', 'c']).most_common()
    >>> {key:[x for x, _ in grp]
    ...  for key, grp in groupby(freq, key=lambda tup: tup[1])}
    {2: ['a', 'c'], 3: ['b']}
    

    【讨论】:

      【解决方案3】:

      我的做法会稍有不同。

      from collections import defaultdict
      
      items = ['a', 'b', 'c', 'a', 'b', 'b', 'c']
      counts = defaultdict(list)
      for item in set(items):
          counts[items.count(item)].append(item)
      dict(counts)
      

      计数然后看起来像这样

      {2: set(['a', 'c']), 3: set(['b'])}
      

      【讨论】:

        猜你喜欢
        • 2022-01-18
        • 1970-01-01
        • 2017-06-06
        相关资源
        最近更新 更多