我正在研究与duplicati类似的细化机制的参考实现,该机制根据年龄删除备份。回到时间上,它会在不断增长的时间范围内建立备份之间的最小时间差。该算法由以迷你语言<frame1>:<limit1>,<frame2>:<limit2>,...,<frameN>:<limitN>
例如,"1D:3h,1W:1D,3M:1W"
的意思是
由于增量过程,可以对“ 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
)意味着x
比y
更具限制性。
如规则#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] 在该过程的开始,所有备份都收集在一个待办事项列表中。此列表按时间顺序排序。现在,将稀疏策略应用于时间范围的时间范围(从最小的时间到最短的时间范围):每个时间范围从待办事项列表中选择(并删除)时间戳。
答案 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)]