筛选包含日期字符串的列表

2024-10-01 19:22:21 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个示例列表,其中每个元素都有一个名称(例如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)

这给了我重复的索引

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


Tags: 代码in列表fornameslistxxxduplicates
2条回答

我尝试使用字典来实现这个目的,其中XXXYYY等可以是键,值可以是日期。这就是实现的样子

dt = ['XXX_20200115', 'XXX_20200116', 'YYY_20200116', 'ZZZ_20200116', 'ZZZ_20200117'] 

dt = [tuple(i.split('_'))for i in dt]

new_dt = {}

for i,j in dt:
    if i not in new_dt.keys():
        new_dt[i]=j
    else:
        if j>new_dt[i]:
            new_dt[i]=j

print(new_dt)

这将给

{'XXX': '20200116', 'YYY': '20200116', 'ZZZ': '20200117'}

最后,如果要转换为原始格式,只需附加键和值,并使其成为具有

new_dt = ["{}_{}".format(i,new_dt[i]) for i in new_dt]

这将给

['XXX_20200116', 'YYY_20200116', 'ZZZ_20200117']

首先根据前3个字母和子列表对元素进行分组max()。如果是字符串,python将根据整数取max:

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)

相关问题 更多 >

    热门问题