2016-12-30 100 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

相關問題