如何用单行代码在Python中按弃1留2规则处理列表元素?
列表按规则筛选的单行Python实现
问题场景
给定列表:
l = [0, 0, 0, 1, 1, 1, 0, 0, 1]
需要按丢弃第一个元素→保留接下来2个→丢弃下1个→保留接下来2个的循环规则处理,预期输出:
[0, 0, 1, 1, 0, 1]
直接用l[::2]会得到[0, 0, 1, 0, 1],不符合要求。
单行解决方案
方案1:列表推导式(无依赖)
利用索引判断规则直接生成结果:
result = [val for idx, val in enumerate(l) if (idx - 1) % 3 in (0, 1)]
逻辑说明:
索引从0开始,第一个元素(idx=0)丢弃,后续元素满足(idx-1) % 3等于0或1时保留:
- idx=1/2 → 余数为0/1 → 保留
- idx=3 → 余数为2 → 丢弃
- idx=4/5 → 余数为0/1 → 保留,以此类推
方案2:切片分组拼接(直观易懂)
从索引1开始每3个元素分一组,每组取前2个后合并:
result = [x for group in [l[i:i+3] for i in range(1, len(l), 3)] for x in group[:2]]
逻辑说明:
range(1, len(l), 3)生成分组起始索引:1、4、7- 对应分组为
[0,0,1]、[1,1,0]、[0,1] - 每组取前2个后,通过嵌套列表推导式合并成最终列表
方案3:迭代器处理(适合超大列表)
用迭代器避免生成中间列表,节省内存:
from itertools import islice; it=iter(l); next(it); result=[x for _ in iter(lambda: list(islice(it,2)), []) for x in _]
逻辑说明:
- 先转为迭代器并丢弃第一个元素(
next(it)) - 循环用
islice每次取2个元素,直到迭代器耗尽,最后合并所有取到的元素
验证结果
以上三种方案运行后,都能得到预期的[0, 0, 1, 1, 0, 1]。
内容的提问来源于stack exchange,提问作者usrp_hacker
相关产品推荐
相关产品推荐

