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)
这给了我与他们的索引重复。
我的问题是,我的目标是为这个问题编写一个最少的代码,但我的代码越来越大,似乎我正在以低效的方式解决这个问题。有人能告诉我用最少的代码解决这个问题的更优化方法吗?
解决方案
首先根据前 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)
推荐阅读
- c++ - C++中的函数定义
- android-studio - 我想使用我在下面制作的导航栏更改我的颤振应用程序的屏幕
- c - GTK Hello World 抱怨未定义的引用
- angular - 将按钮动态添加到垫表角材料
- javascript - 如何使用 javascript 或 lodash 用新对象替换对象?
- kubectl - Microk8s 远程与 kubectl:您必须登录到服务器(未经授权)
- forms - 如何控制 Apache Royale Jewel 表单上的指标差距?
- c# - 创建只读引用结构的集合
- python - Django ModuleNotFoundError:尝试使用 wsgi 服务器托管应用程序时没有名为“mysite.settings”的模块
- html - CSS:如何将一行文本向后换行,以便最终文本始终填满容器的整个宽度?