[英]From a list of tuples [(ID, date),(ID, date)..] create a new list of tuples with unique ID and most recent date
我有一個元組列表[[ID,date),(ID,date),...]。 同一ID可以出現多次或僅出現一次。 如果ID不止一次出現,我只想要最新的ID。
lst = [(587,"2015-01-01"),
(625,"2011-12-01"),
(587,"1998-05-01")]
我要這個:
list2 = [(587,"2015-01-01"),
("625,2011-12-01"),]
其中一個元組看起來像:
(2, 14, 58875, 1, datetime.datetime(2009, 11, 1, 0, 0), u'RB', u'SYSTEM', datetime.datetime(2016, 6, 21, 9, 7, 38), u'SYSTEM', datetime.datetime(2016, 6, 21, 9, 7, 38))
ID字段具有索引2和日期字段索引4
您可以使用帶有空字符串的defaultdict()
作為默認值:
lst = [(587,'2015-01-01'),
(625,'2011-12-01'),
(587,'1998-05-01')]
from collections import defaultdict
result = defaultdict(lambda: "")
for k, v in lst:
if result[k] < v:
result[k] = v
list(result.items())
# [(625, '2011-12-01'), (587, '2015-01-01')]
如果每個元組中的元素太多,無法如上所述進行解包,則可以使用單個變量捕獲元組,然后使用索引來訪問它,例如:
for x in lst:
if result[x[0]] < x[1]:
result[x[0]] = x[1]
list(result.items())
# [(625, '2011-12-01'), (587, '2015-01-01')]
使用itertools.groupby
將元組按第一個元素分組,然后從每個組中選擇最后一個元素:
groups = itertools.groupby(sorted(lst), lambda x:x[0])
[(list(x[1])[-1]) for x in groups]
# [(587, '2015-01-01'), (625, '2011-12-01')]
如果您不想使用任何庫,則應該可以使用:
list2=[]
for i in list1:
if i[0] not in [j[0] for j in list2]:
list2.append(i)
else:
for k in range(len(list2)):
if i[0] == list2[k][0] and i[1] > list2[k][1]:
list2[k] = i
因此,如果ID不在list2
,則它將追加touple,而如果ID在i
date值大於list2
,則它將替換它。
如果您的雙發有其他值,則只需將其調整為您的ID和日期位置即可。 對於這種情況(值,ID,值,值,日期,值...),它將是:
list2=[]
for i in list1:
if i[1] not in [j[1] for j in list2]:
list2.append(i)
else:
for k in range(len(list2)):
if i[1] == list2[k][1] and i[4] > list2[k][4]:
list2[k] = i
希望這對您有所幫助!
一種方法是使用filter()
如下所示:
my_list = [(587, '2015-01-01'),
(625, '2011-12-01'),
(587, '1998-05-01')]
my_keys = set(item[0] for item in my_list) # to eliminate duplicates
res_list = []
for key in my_keys:
res_list.append(filter(lambda item: item[0] == key, my_list)[0])
輸出:
>>> res_list
[(625, '2011-12-01'), (587, '2015-01-01')]
from datetime import datetime
list = [(587,"2015-01-01"),
(625,"2011-12-01"),
(587,"1998-05-01")]
listsort = sorted([(e[0], datetime.strptime(e[1], "%Y-%m-%d")) for e in list])[::]
listfilter = sorted([(k, datetime.strftime(v, "%Y-%m-%d")) for k,v in dict(listsort).iteritems()])
print listfilter
輸出量
[(587, '2015-01-01'),
(625, '2011-12-01')]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.