簡體   English   中英

從元組列表[(ID,date),(ID,date)..]中創建一個具有唯一ID和最新日期的元組列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM