Python双列表匹配提取问题:提取Decline状态对应测试日期
问题描述
有两个长度相同的列表,分别存储测试执行日期和审批状态:
TestDate_lst = ['2022-03-24', '2022-03-24', '2022-03-24', '2022-03-04', '2022-03-24', '2021-04-20', '2021-04-20'] Action_lst = ['Decline', 'Decline', 'Decline', 'Approve', 'Approve', 'Ignore', 'Decline']
需求:提取所有Action_lst中状态为Decline对应的TestDate_lst中的日期。
尝试的错误代码:
DateTest = [] for i in TestDate_lst: for a in Action_lst: if a == "Decline": DateTest.append(i) else: pass
错误输出:
DateTest_lst = ['2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-04', '2022-03-04', '2022-03-04', '2022-03-04', '2022-03-24', '2022-03-24', '2022-03-24', '2022-03-24', '2021-04-20', '2021-04-20', '2021-04-20', '2021-04-20']
预期输出:
DateTest_lst = ['2022-03-24', '2022-03-24', '2022-03-24', '2021-04-20']
解决方案
你的问题出在嵌套循环——外层遍历每个日期,内层遍历所有状态,导致每个日期会被添加多次(次数等于Decline的总数)。正确的做法是同时遍历对应位置的日期和状态,只在当前状态是Decline时添加对应日期。
方法1:使用zip()遍历对应元素
zip()可以将两个列表按索引配对,直接遍历每一组日期和状态:
DateTest = [] for date, action in zip(TestDate_lst, Action_lst): if action == "Decline": DateTest.append(date)
方法2:使用索引遍历
如果需要操作索引,也可以通过range()遍历索引值,然后取对应位置的元素:
DateTest = [] for idx in range(len(TestDate_lst)): if Action_lst[idx] == "Decline": DateTest.append(TestDate_lst[idx])
方法3:列表推导式(简洁写法)
用一行代码实现,效率更高:
DateTest = [date for date, action in zip(TestDate_lst, Action_lst) if action == "Decline"]
以上三种方法都会得到预期输出:
['2022-03-24', '2022-03-24', '2022-03-24', '2021-04-20']
至于你提到的字典,其实没必要——因为两个列表是按顺序一一对应的,用zip直接配对是最直接的方案,字典适合需要键值映射且去重的场景,这里并不适用。
内容的提问来源于stack exchange,提问作者Astro_raf
相关产品推荐
相关产品推荐

