python - 从列表中删除具有重复键元素的元组
问题描述
我正在研究一种细化机制的参考实现,该机制类似于根据年龄删除备份的重复项。回到过去,它在不断增长的时间范围内建立备份之间的最小时间差。该算法由以迷你语言编写的保留策略控制<frame1>:<limit1>,<frame2>:<limit2>,...,<frameN>:<limitN>
例如,"1D:3h,1W:1D,3M:1W"
意味着
- 每 3 小时备份一次,持续一天
- ……每天一星期
- ... 每周 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
) 表示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]在流程开始时,所有备份都收集在待办事项列表中。这个列表是按时间顺序排列的。现在细化策略适用于时间框架(最小的优先):每个时间框架从待办事项列表中选择(并删除)时间戳。
解决方案
你可以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)]