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

如何编写列表推导式将列表中重复元素的重复次数减半?

解决重复元素次数减半的列表处理问题

你的需求是将原列表中每个元素的重复次数减半:第一个元素仅保留1次,其余元素原重复次数为偶数,需除以2。以下是两种可行的实现方案:

方法一:利用itertools.groupby处理连续重复元素

由于你的输入列表中相同元素是连续出现的,itertools.groupby可以直接按连续相同元素分组,统计每组长度后生成新列表:

import itertools

original_list = [
    [255, 255, 255],
    [255, 0, 0],
    [255, 0, 0],
    [0, 255, 0],
    [0, 255, 0],
    [0, 255, 0],
    [0, 255, 0],
    [0, 255, 0],
    [0, 255, 0]
]

new_list = []
for key, group in itertools.groupby(original_list):
    group_length = len(list(group))
    # 第一个元素直接保留1次
    if key == original_list[0]:
        new_list.append(key)
    else:
        # 其余元素重复次数减半
        new_list.extend([key] * (group_length // 2))

print(new_list)

输出结果:

[[255, 255, 255], [255, 0, 0], [0, 255, 0], [0, 255, 0], [0, 255, 0]]

方法二:统计所有元素出现次数(通用非连续场景)

如果列表中相同元素不连续,可先统计每个元素的总出现次数,再按规则生成新列表:

from collections import defaultdict

original_list = [
    [255, 255, 255],
    [255, 0, 0],
    [255, 0, 0],
    [0, 255, 0],
    [0, 255, 0],
    [0, 255, 0],
    [0, 255, 0],
    [0, 255, 0],
    [0, 255, 0]
]

# 统计每个元素的出现次数(列表转元组作为字典键)
count_dict = defaultdict(int)
for item in original_list:
    count_dict[tuple(item)] += 1

new_list = []
# 记录已处理过的元素,保持原列表顺序
processed = set()

for item in original_list:
    item_tuple = tuple(item)
    if item_tuple not in processed:
        processed.add(item_tuple)
        if item == original_list[0]:
            new_list.append(item)
        else:
            new_list.extend([item] * (count_dict[item_tuple] // 2))

print(new_list)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:15:25