Pythonic 方法来计算计数器中重复项的最频繁项,分别按元素数?

Pythonic way to count the most frequent items with duplicates in Counter, separately by number of elements?

我对解决以下问题的简洁(+最佳)方法很感兴趣,因为我很好奇如何以 Pythonic 方式执行它。在做一个单独的任务时,我试图制作一个包含任意元素的 collections.Counter 字典:

d = Counter({('A','C'): 4, ('B','D','E'): 3, ..., ('A','G','V','X','Z'): 1, ('L','Z'): 1})

这里,每个元素都是一个元组,由2个或多个字符组成。我的目例如,解决方案可能如下所示:

d_sample = Counter({('A', 'C'): 4, ('B', 'D', 'E'): 3, ('A' ,'D'): 3, ('C', 'D', 'E'): 3, 
                    ('A', 'B', 'C', 'D', 'E'): 2, ('A', 'C', 'D', 'E'): 1, 
                    ('B', 'C', 'D', 'E'): 1, ('D', 'E'): 1})

result = [('A', 'C'), ('B', 'D', 'E'), ('C', 'D', 'E'), ('A', 'B', 'C', 'D', 'E'),
         ('A', 'C', 'D', 'E'), ('B', 'C', 'D', 'E')]

这里选择了('A', 'C'),因为它是有两个元素的元组中计数最高的。 ('B', 'D', 'E')('C', 'D', 'E') 都被选中,因为它们是具有最高计数的三个元素的元组。 result 列表中的其他元素也是如此。

我想到的方法是使用for循环从d中提取几个列表,按元素数分隔:for i in range(2, # maximum elements using another for loop)。从那里,我使用另一个 for 循环和 max().

计算频率最高的项目
# pseudo-example:

maxval = 2

for x in d:
   if len(x[0]) > maxval:
       maxval = len(x[0])

counter_list = [[] * n for n in range(maxval-2)]

for x in d:
   counter_list[len(x[0])-2].append(x)

## selecting max per list

正如所阐述的那样,这似乎根本不是 Pythonic 和最佳的。任何更优化地交付任务的见解将不胜感激。

这是 O(n),我认为不可能渐进地比这更好。

highest_count_for_length = {}
result = []
for tup, count in d.items():
    try:
        if highest_count_for_length[len(tup)] == count:
            result.append(tup)
    except KeyError:
        # we haven't seen this length yet
        highest_count_for_length[len(tup)] = count
        result.append(tup)

它确实依赖于输入已经按值排序的事实。