如何按和为偶数条件比较两列表元素,生成低重复list3?
列表元素匹配去重需求的实现方案
问题说明
给定两个列表:list1 = [3,4,5,6,7,8]list2 = [8,9,10,12,14,16,18,20]
需要完成以下操作:
- 逐个遍历
list1的元素,与list2的每个元素比较 - 若两数之和为偶数,将
list2中的该元素加入list3 - 尽可能减少
list3的重复值:list2的元素一旦被使用就不再复用,只有当没有其他符合条件的可选元素时,才允许重复使用
示例输出:[9, 8, 8, 10, 9, 12]
注:示例中8仅在与5求和为偶数且无其他可选元素时重复使用;7因8已被使用两次,改用9。
实现思路
核心是优先分配未使用过的符合条件的元素,仅当无可用新元素时才复用旧元素。具体步骤:
- 先按奇偶性对
list2分组:两数之和为偶数的前提是同奇同偶,直接按奇偶性划分候选池,避免每次遍历整个list2。 - 为每个奇偶分组维护可用元素队列和已使用元素池:
- 处理
list1元素时,先判断其奇偶性,找到对应候选池 - 优先从可用队列中取元素,取完后移入已使用池
- 若可用队列空了,就从已使用池中循环取元素(重复复用)
- 处理
- 按
list1的顺序逐个处理,收集结果到list3。
代码实现
from collections import deque list1 = [3,4,5,6,7,8] list2 = [8,9,10,12,14,16,18,20] # 按奇偶性拆分list2,初始化可用队列和已使用池 odd_candidates = deque([x for x in list2 if x % 2 != 0]) even_candidates = deque([x for x in list2 if x % 2 == 0]) odd_used = [] even_used = [] list3 = [] for num in list1: if num % 2 != 0: # 当前元素是奇数,匹配同奇元素 if odd_candidates: selected = odd_candidates.popleft() list3.append(selected) odd_used.append(selected) else: # 无新元素可用,循环复用已使用的 selected = odd_used.pop(0) list3.append(selected) odd_used.append(selected) else: # 当前元素是偶数,匹配同偶元素 if even_candidates: selected = even_candidates.popleft() list3.append(selected) even_used.append(selected) else: # 无新元素可用,循环复用已使用的 selected = even_used.pop(0) list3.append(selected) even_used.append(selected) print(list3) # 输出符合示例逻辑的结果
更优方案
上述方案已满足需求,若要进一步优化,可从以下方向调整:
- 简化复用逻辑:无需分开维护可用队列和已使用池,直接用循环队列(
deque本身支持旋转)。取元素后直接放回队列尾部,后续需要复用时直接取队首即可,减少列表操作开销。 - 均衡复用策略:如果需求允许,可记录每个元素的使用次数,优先复用使用次数最少的元素,而不是按顺序复用,能更均衡地降低重复率。
- 预处理优化:提前对
list2的奇偶分组去重(如果list2有重复元素),减少无效候选,提升匹配效率。
优化后的示例代码(循环队列版):
from collections import deque list1 = [3,4,5,6,7,8] list2 = [8,9,10,12,14,16,18,20] # 按奇偶性生成循环队列 odd_queue = deque([x for x in list2 if x % 2 != 0]) even_queue = deque([x for x in list2 if x % 2 == 0]) list3 = [] for num in list1: if num % 2 != 0: selected = odd_queue.popleft() list3.append(selected) odd_queue.append(selected) # 放回队列,用于后续复用 else: selected = even_queue.popleft() list3.append(selected) even_queue.append(selected) print(list3)
内容的提问来源于stack exchange,提问作者user12314164
相关产品推荐
相关产品推荐

