从具有重复键元素的列表中移除元组

2024-10-06 16:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个参考实现,它实现了一个类似于duplicati的细化机制,该机制可以根据年龄删除备份。回溯时间,它在不断增长的时间范围内建立备份之间的最小时间差。此算法由用小型语言编写的保留策略控制<frame1>:<limit1>,<frame2>:<limit2>,...,<frameN>:<limitN>

例如,"1D:3h,1W:1D,3M:1W"表示

  • 每3小时备份一次,持续一天
  • 。。。一周内每天
  • 。。。每周三个月
  • 删除所有旧的

由于增量过程,可以“优化”此迷你语言中的“程序”:

  • "4W:2D,4W:1D"转化为"4W:2D"应用规则#1 x:a,x:b => x:a
  • "2W:2D,4W:2D"转化为"4W:2D"应用规则#2 a:x,b:x => max(a,b):x
  • "2W:2D,4W:1D"转化为"4W:2D"应用规则#3 a: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]在流程开始时,所有备份都收集在待办事项列表中。这个列表是按时间顺序排列的。现在细化策略应用于时间帧的时间帧(最小优先):每个时间帧从待办事项列表中选择(并删除)时间戳。你知道吗


Tags: key语言列表if排序规则时间备份