我正在研究一种类似于duplicati的细化机制的参考实现,该机制根据年龄删除备份。回顾过去,它在不断增长的时间范围内建立了备份之间的最小时间差。此算法由用迷你语言编写的保留策略控制<frame1>:<limit1>,<frame2>:<limit2>,...,<frameN>:<limitN>
例如,"1D:3h,1W:1D,3M:1W"表示
每3小时备份一次,持续一天
... 一周内每天
... 三个月来每周
删除所有旧的
由于增量过程,[1]“程序”在此迷你语言中可以“优化”:
"4W:2D,4W:1D"进入"4W:2D"应用规则1x:a,x:b => x:a
"2W:2D,4W:2D"进入"4W:2D"应用规则2a:x,b:x => max(a,b):x
"2W:2D,4W:1D"进入"4W:2D"应用规则3a:x,b:y => max(a,b):x (if x >= y)
规则3是关于连续的时间帧(a < b),首先应用更严格的限制(x)。限制是绝对距离,而不是频率,因此(x > y)意味着xy更具限制性。
规范化:
如规则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]在进程开始时,所有备份都收集在待办事项列表中。这个名单是按时间顺序排列的。现在细化策略应用于时间帧的时间帧(最小优先):每个时间帧从待办事项列表中选择(并移除)时间戳。

最佳答案

您可以在这里使用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)]

关于python - 从列表中删除具有重复键元素的元组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58503746/

10-11 00:09