Python双列表场景下移除重复状态元素组并保留首个元素
嘿,我来帮你解决这个问题!你的需求是移除状态列表里连续重复的元素组,只保留每组的第一个,同时对应移除时间列表里的元素,而且不能用字典对吧?先说说你之前代码的问题,再给你一个靠谱的解法。
为什么你的代码会出问题?
你之前的思路是用0标记要删除的元素再移除,但这里有几个坑:
- 循环里用
range(len(state)),但在循环中修改列表元素后,后续的索引会和原列表对应不上;而且当i=0时,i-1是-1,会取到列表最后一个元素,这会导致第一个元素被错误标记; - 如果你的状态列表本身就有0这个值,那
remove(0)会误删原本要保留的元素; - 这种标记再删除的方式效率也不高,还容易漏掉一些重复项。
正确的解法:构建新列表
我们可以直接遍历两个列表,只把和上一个保留状态不同的元素加入新列表,这样逻辑清晰,还不会破坏原列表,效率也高。代码如下:
# 你的原始列表示例 state = [4,4,4,5,5,5,4,4,3,3,5,5] tt_time = [1,2,3,4,5,6,7,8,9,10,11,12] # 初始化新列表,先加入第一个元素(第一个元素肯定要保留) new_state = [state[0]] new_time = [tt_time[0]] # 从第二个元素开始遍历 for i in range(1, len(state)): # 只要当前状态和新列表里最后一个状态不一样,就加入新列表 if state[i] != new_state[-1]: new_state.append(state[i]) new_time.append(tt_time[i]) # 查看结果 print(new_state) # 输出: [4, 5, 4, 3, 5] print(new_time) # 输出: [1, 4, 7, 9, 11]
逻辑说明:
- 先把第一个元素加入新列表,因为它是第一个连续组的开头,必须保留;
- 从第二个元素开始,每次和新列表里最后一个元素(也就是上一个保留的状态)对比,如果不同,说明进入了新的连续组,就把当前状态和对应时间加入新列表;
- 整个过程只需要遍历一次列表,时间复杂度是O(n),对于4000长度的列表完全无压力;
- 完全不用字典,符合你的要求。
对了,你给出的期望时间列表里写的是[1,4,7,8,11],这应该是笔误吧?按照“保留每组首个元素”的要求,第四个组(状态3)的首个时间是9,所以正确的时间列表应该是[1,4,7,9,11]哦。
内容的提问来源于stack exchange,提问作者rum404
相关产品推荐
相关产品推荐

