首页 > 解决方案 > 过滤包含日期字符串的列表

问题描述

下面是一个示例列表,其中每个元素都有一个名称(例如XXX)和关联的日期(例如20200115

[XXX_20200115, XXX_20200116, YYY_20200116, ZZZ_20200116, ZZZ_20200117] 

我想从列表中删除名称相同但日期较旧的所有元素。例如,我想删除XXX_20200115,因为XXX_20200116已经存在最新日期。

所以我的最终输出应该是:

[ XXX_20200116, YYY_20200116, ZZZ_20200117]

直到现在我写了这段代码:

from collections import defaultdict

def list_duplicates(seq):
    tally = defaultdict(list)
    for i,item in enumerate(seq):
        tally[item].append(i)
    return ((key,locs) for key,locs in tally.items() 
                            if len(locs)>1)


def filterModules(mylist):
    names = []
    timestamps =  []

    for module in mylist:
         splittedName = module.rsplit('_', 1)
         names.append(splittedName[0])
         timestamps.append(splittedName[1])

    duplicates = []
    for dup in sorted(list_duplicates(names)):
        duplicate = {}
        duplicate['name'] = dup[0]
        duplicate['indexs'] = dup[1]
        duplicates.append(duplicate)

这给了我与他们的索引重复。

我的问题是,我的目标是为这个问题编写一个最少的代码,但我的代码越来越大,似乎我正在以低效的方式解决这个问题。有人能告诉我用最少的代码解决这个问题的更优化方法吗?

标签: pythonpython-3.xlistdatefilter

解决方案


首先根据前 3 个字母和子列表中的元素对元素进行分组max()。如果它是字符串,python 也会根据整数取最大值:

from itertools import groupby

l1 = ["XXX_20200115", "XXX_20200116", "YYY_20200116", "ZZZ_20200116", "ZZZ_20200117"]

l2 = [list(g) for k, g in groupby(l1, key=lambda x: x.split("_")[0])]

new_l = [max(i) for i in l2]

print(new_l)

推荐阅读