You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何匹配并移除列表中长度相同的成对元素?

解决列表中移除同长度成对字符串的问题

要处理非相邻的同长度元素成对移除,核心是先统计所有长度的出现次数,再根据奇偶性筛选需要保留的元素,而非只检查相邻元素。

实现思路

  1. 统计每个字符串长度的总出现次数,判断哪些长度需要保留(次数为奇数时保留1个,偶数时全部移除)
  2. 遍历原列表,按顺序收集需要保留的元素,确保最终结果的元素顺序和原列表一致

代码实现

from collections import Counter

def filter_paired_lengths(str_list):
    # 统计各长度的出现次数
    length_counts = Counter(len(s) for s in str_list)
    # 计算每个长度需要保留的数量(奇数留1,偶数留0)
    need_keep = {length: count % 2 for length, count in length_counts.items()}
    result = []
    
    for s in str_list:
        current_len = len(s)
        if need_keep[current_len] > 0:
            result.append(s)
            need_keep[current_len] -= 1
    return result

测试示例

示例1

输入列表:["book","rule","eraser","clipboard","pencil","book"]

test_list = ["book","rule","eraser","clipboard","pencil","book"]
print(filter_paired_lengths(test_list))  # 输出: ['clipboard', 'book']

说明:长度4出现3次(留1个),长度6出现2次(全部移除),长度10出现1次(留1个),最终保留原列表中最后一个符合条件的元素。

示例2

输入列表:["book","rule","eraser","clipboard","pencil"]

test_list2 = ["book","rule","eraser","clipboard","pencil"]
print(filter_paired_lengths(test_list2))  # 输出: ['eraser', 'clipboard', 'pencil']

说明:长度4出现2次(全部移除),其余长度各出现1次(全部保留)。

为什么你的原方法不行?

zip(lists, lists[1:])只能对比相邻元素,无法统计全局的长度出现次数,因此无法处理非相邻的同长度元素配对问题。上面的方法通过全局统计+顺序筛选,完美解决了这个问题。

内容的提问来源于stack exchange,提问作者Dude Rar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:55:17