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

时间:2019-10-22 11:55:29

标签: python python-3.x list

我正在研究与duplicati类似的细化机制的参考实现,该机制根据年龄删除备份。回到时间上,它会在不断增长的时间范围内建立备份之间的最小时间差。该算法由以迷你语言<frame1>:<limit1>,<frame2>:<limit2>,...,<frameN>:<limitN>

编写的保留策略控制

例如,"1D:3h,1W:1D,3M:1W"的意思是

  • 每3个小时保留一份备份,持续1天
  • ...每天一星期
  • ...每周3个月
  • 删除所有较旧的

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

  • "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所示,仅应用两个相同帧间疏级别中的第一个。我选择了限制最小的那个。因此,可以对细化策略进行预处理,以将对(frame,limit)对的排序列表减少为具有 limit最低值的每个 frame 的对(我用数字代替了时间增量):

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] 在该过程的开始,所有备份都收集在一个待办事项列表中。此列表按时间顺序排序。现在,将稀疏策略应用于时间范围的时间范围(从最小的时间到最短的时间范围):每个时间范围从待办事项列表中选择(并删除)时间戳。

1 个答案:

答案 0 :(得分:4)

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