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

Python 从具有重复键元素的列表中删除元组,python,python-3.x,list,Python,Python 3.x,List,我正在研究一个参考实现的细化机制,该机制类似于根据时间删除备份的机制。回溯时间,它在不断增长的时间范围内建立了备份之间的最小时间差。此算法由以小型语言编写的保留策略控制:,:,…,: 例如,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=>m

我正在研究一个参考实现的细化机制,该机制类似于根据时间删除备份的机制。回溯时间,它在不断增长的时间范围内建立了备份之间的最小时间差。此算法由以小型语言编写的保留策略控制:,:,…,:

例如,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=>maxa,b:x 2W:2D,4W:1D到4W:2D应用规则3 a:x,b:y=>maxa,如果x>=y,则b:x 规则3是关于连续时间帧ay意味着x比y更具限制性

正常化: 如规则1所示,仅应用两个相同帧细化级别中的第一个。我选择了限制最少的那个。因此,可以对细化策略进行预处理,以减少帧对的排序列表,将其限制为每个帧的列表,用数字替换时间增量的最低限制I:

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] 在流程开始时,所有备份都收集在待办事项列表中。此列表按反时间顺序排序。现在,细化策略首先应用于最小时间帧的时间帧:每个时间帧从待办事项列表中选择并删除时间戳。

您可以在此处使用:


在我读到的文档中,通常需要在同一个键函数上对iterable进行排序。在给定的情况下,它不是同一个键,而是key=itemgetter0的稳定排序保持元组的排序列表不变。这应该按照@wolf的要求执行,因为排序将按元组中的不同元素排序,即,首先按第一项排序,然后在另一个元组中有多个相等值的情况下,按第二项排序,依此类推。因此,按照第一个元素进行分组会很好,因为根据我从这个问题中推断出的,这绝对是你想要的,需要阅读和学习的东西很多:感谢这个有洞察力的答案!第一条规则不应该是x,a,x,b=>x,mina,b吗?出于同样的原因,我不理解规则3。如果将4W:2D、4W:1D转换为4W:2D,则每隔一天就会错过一次备份。然后,你写下,你想保持元组的最小秒,这听起来更合理的条款1。“你能澄清一下吗?”我希望是位客人。感谢您对这些问题的评论。
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)]