如何按指定索引筛选嵌套列表?日期筛选代码修正求助
解决嵌套列表的日期筛选问题
我来帮你搞定这个筛选逻辑!你的原代码有两个关键问题导致结果不符合预期:
- 没有精准定位到每个子列表的日期元素(索引[1]),反而遍历了子列表的所有元素
- 条件判断的方向搞反了:应该是「筛选关键词在日期字符串里」,而不是「日期字符串在筛选关键词里」
问题根源拆解
原代码里的if x in f完全搞反了逻辑:比如你想匹配2019-12-08,但'2019-12-08' in '2019-'是False,只有当x是No-Date时,'No-Date' in 'No-Date'才是True,这就是为什么只有无日期的条目被筛选出来。
正确的循环实现
我们只需要针对每个子列表的索引[1]元素做判断,同时修正条件方向:
lim = [ ['xxx', 'No-Date', 'xxx'], ['xxx', '2019-12-08', 'xxx'], ['xxx', '2019-07-12', 'xxx'], ['xxx', '2018-11-13', 'xxx'], ['xxx', '2017-10-03', 'xxx'], ['xxx', '2016-01-05', 'xxx'], ['xxx', '2019-10-24T15:09:00+02:00', 'xxx'], ] li_zj = [] filter_years = ['2018-', '2019-'] for line in lim: date_item = line[1] # 满足条件:要么是无日期,要么包含2018/2019的年份前缀 if date_item == 'No-Date' or any(year in date_item for year in filter_years): li_zj.append(line) print(li_zj)
更简洁的列表推导式实现
用列表推导式可以一行搞定,逻辑和上面完全一致:
lim = [ ['xxx', 'No-Date', 'xxx'], ['xxx', '2019-12-08', 'xxx'], ['xxx', '2019-07-12', 'xxx'], ['xxx', '2018-11-13', 'xxx'], ['xxx', '2017-10-03', 'xxx'], ['xxx', '2016-01-05', 'xxx'], ['xxx', '2019-10-24T15:09:00+02:00', 'xxx'], ] filter_years = ['2018-', '2019-'] li_zj = [line for line in lim if line[1] == 'No-Date' or any(y in line[1] for y in filter_years)] print(li_zj)
验证输出
运行上面的代码,会得到你期望的结果:
[ ['xxx', 'No-Date', 'xxx'], ['xxx', '2019-12-08', 'xxx'], ['xxx', '2019-07-12', 'xxx'], ['xxx', '2018-11-13', 'xxx'], ['xxx', '2019-10-24T15:09:00+02:00', 'xxx'], ]
内容的提问来源于stack exchange,提问作者gython
相关产品推荐
相关产品推荐

