我感兴趣的是一种简洁的(+最优)方法来解决下面的问题,因为我很好奇如何以Pythonic的方式执行它.在执行另一项任务时,我试图制作一本包含任意元素的collections.Counter字典:

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

这里,每个元素都是一个元组,由2个或更多字符组成.我的目标是创建一个包含最常见项目with个重复项的列表uniquely by the number of elements in a tuple.例如,解决方案可能如下所示:

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')]

这里 Select ('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

如前所述,这似乎根本不是一个好办法.如有任何能更好地完成任务的见解,我们将不胜感激.

推荐答案

这是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)

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

Python相关问答推荐

如何在Pygame中绘制右对齐的文本?

是pandas.DataFrame使用方法查询后仍然排序吗?

在for循环中仅执行一次此操作

用gekko解决的ADE方程系统突然不再工作,错误消息异常:@错误:模型文件未找到.& &

如何处理嵌套的SON?

使用LineConnection动画1D数据

如何自动抓取以下CSV

难以在Manim中正确定位对象

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

如何根据参数推断对象的返回类型?

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

什么相当于pytorch中的numpy累积ufunc

如何根据一列的值有条件地 Select 前N组?

Pandas Loc Select 到NaN和值列表

将scipy. sparse矩阵直接保存为常规txt文件

在输入行运行时停止代码

将一个双框爆炸到另一个双框的范围内

判断Python操作:如何从字面上得到所有decorator ?