collections.Counter: most_common INCLUDING equal counts

后端 未结 2 1519
南旧
南旧 2021-01-13 03:48

In collections.Counter, the method most_common(n) returns only the n most frequent items in a list. I need exactly that but I need to include the e

相关标签:
2条回答
  • 2021-01-13 04:37

    For smaller sets, just write a simple generator:

    >>> test = Counter(["A","A","A","B","B","C","C","D","D","E","F","G","H"])
    >>> g=(e for e in test.most_common() if e[1]>=2)
    >>> list(g)
    [('A', 3), ('D', 2), ('C', 2), ('B', 2)]
    

    For larger set, use ifilter (or just use filter on Python 3):

    >>> list(ifilter(lambda t: t[1]>=2, test.most_common()))
    [('A', 3), ('C', 2), ('B', 2), ('D', 2)]
    

    Or, since most_common are already ordered, just use a for loop and break on the desired condition in a generator:

    def fc(d, f):
        for t in d.most_common():
            if not f(t[1]): 
                break
            yield t
    
    >>> list(fc(test, lambda e: e>=2)) 
    [('A', 3), ('B', 2), ('C', 2), ('D', 2)]
    
    0 讨论(0)
  • 2021-01-13 04:44

    You can do something like this:

    from itertools import takewhile
    
    def get_items_upto_count(dct, n):
      data = dct.most_common()
      val = data[n-1][1] #get the value of n-1th item
      #Now collect all items whose value is greater than or equal to `val`.
      return list(takewhile(lambda x: x[1] >= val, data))
    
    test = Counter(["A","A","A","B","B","C","C","D","D","E","F","G","H"])
    
    print get_items_upto_count(test, 2)
    #[('A', 3), ('C', 2), ('B', 2), ('D', 2)]
    
    0 讨论(0)
提交回复
热议问题