从元组列表[(ID,日期),(ID,日期)..]创建具有唯一ID和最近日期的元组的新列表

时间:2016-12-18 19:48:38

标签: python

我有一个元组列表[(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

5 个答案:

答案 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')]