如何匹配并移除列表中长度相同的成对元素?
解决列表中移除同长度成对字符串的问题
要处理非相邻的同长度元素成对移除,核心是先统计所有长度的出现次数,再根据奇偶性筛选需要保留的元素,而非只检查相邻元素。
实现思路
- 统计每个字符串长度的总出现次数,判断哪些长度需要保留(次数为奇数时保留1个,偶数时全部移除)
- 遍历原列表,按顺序收集需要保留的元素,确保最终结果的元素顺序和原列表一致
代码实现
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
相关产品推荐
相关产品推荐

