如何移除二维员工工时列表中的重复连续区间?
解决员工工时列表的重复条目问题
首先看你的需求:工时列表中存在连续重复的条目组(比如示例里索引0-1和2-3完全重复),需要移除重复的组,保留唯一的工时记录序列。
原代码的问题
你的代码逻辑存在几个关键问题:
- 比较逻辑不匹配需求:你是单个条目和隔两个的条目比较,但实际需要处理的是连续两组条目重复的情况,单个条目相等不代表整组重复,而且这种比较方式会导致后续处理混乱。
- 循环中断时机错误:else分支里直接赋值原列表并break,导致一旦遇到不相等的条目就终止处理,无法完成整个列表的去重。
- 截取方式无效:当找到重复时直接取
l+2:的切片,这个切片本身还包含重复的条目(比如示例里索引2、3就是你要移除的重复项),等于没解决问题。
解决方案
针对你的场景,推荐按条目组去重的方式:把每两个条目视为一个薪资周期的完整记录组,先分组再去重,最后展开成原格式。
实现代码
def deduplicate_hours(hours_list): # 将工时列表按每2个条目分为一组(对应薪资周期的两周记录) groups = [hours_list[i:i+2] for i in range(0, len(hours_list), 2)] seen = set() unique_groups = [] for group in groups: # 把组内的列表转成tuple(列表不可哈希,无法存入集合) group_tuple = tuple(tuple(item) for item in group) if group_tuple not in seen: seen.add(group_tuple) unique_groups.extend(group) return unique_groups # 遍历所有员工,处理工时列表 for emp in employeeList: emp.hours = deduplicate_hours(emp.hours) print(f"{emp.name} 的去重后工时:{emp.hours}")
效果验证
用你的示例数据测试:
原工时列表:
[['(29/11/2020 to 12/12/2020)', 45.0], ['(29/11/2020 to 12/12/2020)', 48.0], ['(29/11/2020 to 12/12/2020)', 45.0], ['(29/11/2020 to 12/12/2020)', 48.0], ['(13/12/2020 to 26/12/2020)', 46.0], ['(13/12/2020 to 26/12/2020)', 32.5]]
处理后会得到:
[['(29/11/2020 to 12/12/2020)', 45.0], ['(29/11/2020 to 12/12/2020)', 48.0], ['(13/12/2020 to 26/12/2020)', 46.0], ['(13/12/2020 to 26/12/2020)', 32.5]]
完全符合你保留非重复条目的需求。
额外说明
如果你的重复模式不是固定的两组,而是任意位置的单个重复条目,可以调整逻辑为遍历整个列表,记录已出现过的条目(同样转成tuple存集合),跳过重复项:
def deduplicate_single_entries(hours_list): seen = set() unique_hours = [] for item in hours_list: item_tuple = tuple(item) if item_tuple not in seen: seen.add(item_tuple) unique_hours.append(item) return unique_hours
但根据你的描述,显然按组去重更贴合你的业务场景。
内容的提问来源于stack exchange,提问作者Francis Bessette
相关产品推荐
相关产品推荐

