2016-12-30 95 views
2

我的元组看起来像 items = [(id, date), ...]列表元组:由元素比较删除元组,如果他们有另一个相同的元素

我要过滤元组的名单,所以我只抱着一个列表为每个唯一的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')] 

我在寻找最典雅和“Python化”解决了这个问题,谢谢!

+0

排序,然后通过使用'itertools.groupby'将它们分组id,然后使用带键功能的'max'来查找最近的日期。我认为你可以使用'datetime.date',但是我必须检查 –

回答

0

我们要对它们进行排序,然后将它们用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.strptime得到的日期时间

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])] 
+0

如何用一个更大的元组),我试图省略我原来的帖子中不必要的细节,但我的实际数据如下所示: '('104587520','13347465','17776122','Update','12/29/2016 13:32:45 ')' 其中,元组[0]是我正在过滤的ID,元组[5]是我比较的日期 –

+0

@naterobo请参阅我的编辑 –

3

一种方法是简单地转换成字典,然后再返回(如果你真的需要它作为元组列表 - 或将它作为字典)。
如果元组不按日期顺序排列,那么你可以简单地sorted基于日期:

>>> 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')] 
+0

所以这依赖于'dict()'忽略除第一个元素之外的所有元素(关键字)?我没有意识到这种行为。 –

+0

'dict'键是唯一的,所以任何将来的'key'都会覆盖前面的'value','sorted''确保最后一个'key'具有最新的'date' – AChampion

相关问题