首页 > 解决方案 > 从列表中删除具有重复键元素的元组

问题描述

我正在研究一种细化机制的参考实现,该机制类似于根据年龄删除备份的重复项。回到过去,它在不断增长的时间范围内建立备份之间的最小时间差。该算法由以迷你语言编写的保留策略控制<frame1>:<limit1>,<frame2>:<limit2>,...,<frameN>:<limitN>

例如,"1D:3h,1W:1D,3M:1W"意味着

由于增量过程,[1]这种迷你语言中的“程序”可以“优化”:

规则 #3 是关于连续的时间框架 ( a < b),首先应用了更严格的限制 ( x)。限制是绝对距离,而不是频率,因此 ( x > y) 表示x比 更具限制性y

标准化:

如规则 #1 所示,仅应用两个相同帧细化级别中的第一个。我选择了限制最少的那个。因此,可以对细化策略进行预处理,将已排序的对(帧、限制)列表减少到具有最低限制的每个的列表(我用数字替换了时间增量):

user_input = [(30, 3), (20, 4), (20, 5), (10, 1), (10, 2)]
expected_output = [(10, 1), (20, 4), (30, 3)]

这是我到目前为止所拥有的:

def normalized(thinning):
    thinning = sorted(thinning)
    deduped = []
    key = None
    for t in thinning:
        if t[0] != key:
            deduped.append(t)
            key = t[0]
    thinning = deduped
    return thinning

是否有一种明显的方法可以导致更紧凑(可能程序更少)的版本?


[1]在流程开始时,所有备份都收集在待办事项列表中。这个列表是按时间顺序排列的。现在细化策略适用于时间框架(最小的优先):每个时间框架从待办事项列表中选择(并删除)时间戳。

标签: pythonpython-3.xlist

解决方案


你可以itertools.groupby在这里使用:

from itertools import groupby
from operator import itemgetter

[next(v) for _,v in groupby(sorted(user_input), key=itemgetter(0))]
# [(10, 1), (20, 4), (30, 3)]

推荐阅读