我有一个元组列表[(ID,日期),(ID,日期),...]。相同的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
答案 0 :(得分:3)
您可以使用带有空字符串的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')]
作为默认值:
defaultdict()
如果每个元组中的元素太多而无法解压缩,则可以使用单个变量捕获元组,然后使用index来访问它,例如:
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')]
答案 1 :(得分:2)
使用:set wrap
:set textwidth=0
:set wrapmargin=0
按第一个元素对元组进行分组,然后从每个组中选择最后一个元素:
itertools.groupby
答案 2 :(得分:1)
如果您不想使用任何库,这应该有效:
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
中,则会附加标题,如果是,并且i
日期值高于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
希望这有帮助!
答案 3 :(得分:1)
一种方法是使用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')]
答案 4 :(得分:1)
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')]