Python 元组列表:如果元组有另一个相同的元素,则通过比较元素来删除元组

Python 元组列表:如果元组有另一个相同的元素,则通过比较元素来删除元组,python,list,tuples,list-comprehension,Python,List,Tuples,List Comprehension,我有一个元组列表,看起来像 items=[(id,日期),…] 我想过滤元组列表,这样对于每个唯一id,我只保留一个元组,对于所有出现的具有相同id的元组,我想保留具有最新日期值的条目 例如: items = [('1', '12/2/2016'), ('2', '12/20/2016'), ('1', '12/24/2016')] # Apply filter comparing tuples with identical [0] element based off [1] element

我有一个元组列表,看起来像
items=[(id,日期),…]

我想过滤元组列表,这样对于每个唯一id,我只保留一个元组,对于所有出现的具有相同id的元组,我想保留具有最新日期值的条目

例如:

items = [('1', '12/2/2016'), ('2', '12/20/2016'), ('1', '12/24/2016')]

# Apply filter comparing tuples with identical [0] element based off [1] element

items = [('2', '12/20/2016'), ('1', '12/24/2016')]

我正在寻找解决这个问题的最优雅和“pythonic”的解决方案,谢谢

一种方法是简单地转换成字典,然后再转换回来(如果您真的需要它作为元组列表,或者将它作为dict)。
如果元组不按日期顺序排列,则可以简单地根据日期排序:

>>> from datetime import datetime
>>> items = [('1', '12/2/2016'), ('2', '12/20/2016'), ('1', '12/24/2016')]
>>> d = dict(sorted(items, key=lambda x: datetime.strptime(x[1], '%m/%d/%Y')))
>>> items = list(d.items())
[('2', '12/20/2016'), ('1', '12/24/2016')]

我们将对它们进行排序,然后使用
itertools对它们进行分组。groupby
然后使用
max
查找最近的日期。我们将编写一个键函数,它接受其中一个元组并返回一个
datetime.date
对象

from datetime import date
from itertools import groupby

def make_date(t):
    month, day, year = map(int, t[1].split('/'))
    return date(year, month, day)

items = [max(g, key=make_date) for k, g in groupby(sorted(items, key=lambda x: int(x[0])), key=lambda x: x[0])]
编辑:我们只需获取
t[-1]
即可获取元组的最后一个元素,并使用
datetime.datetime.strtime
获取日期时间

from datetime import datetime
from itertools import groupby

items = [max(g, key=lambda x: datetime.strptime(x[-1], '%m/%d/%Y %H:%M:%S')) for k, g in groupby(sorted(items, key=lambda x: int(x[0])), key=lambda x: x[0])]

对它们进行排序,然后使用
itertools.groupby
按id对它们进行分组,然后使用带有键函数的
max
查找最近的日期。我想您可以使用
datetime.date
来实现这个功能,但是我必须进行检查,所以这依赖于
dict()
忽略除第一个元组之外的所有元组以及相同的第一个元素(键)?我没有意识到这种行为。
dict
键是唯一的,因此任何未来的
都会覆盖以前的
排序
确保最后一个
具有最新的
日期
我如何使用更大的元组(大小5)来实现这一点,我试图在我的原始帖子中省略不必要的细节,但是我的实际数据看起来像:“('104587520','13347465','17776122','Update','12/29/2016 13:32:45'),其中tuple[0]是我过滤的ID,tuple[5]是我比较的日期。”