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

如何用Python随机排序嵌套列表,避免同名元素相邻

实现随机排序且相同姓名不相邻的Python方案

核心思路

由于你的场景已确定存在可行解,我们采用贪心算法+随机化的思路:先按姓名归类元素,每次优先选择剩余数量最多、且与上一个选中姓名不同的组别,同时加入随机选择逻辑保证结果的随机性。

代码实现

import random
from collections import defaultdict

def shuffle_no_adjacent(original_list):
    # 按姓名分组存储元素
    name_groups = defaultdict(list)
    for item in original_list:
        name_groups[item[0]].append(item)
    
    # 打乱每组内的元素,提升随机性
    for name in name_groups:
        random.shuffle(name_groups[name])
    
    result = []
    prev_name = None
    
    while name_groups:
        # 筛选出与上一个姓名不同的可用组别
        available_names = [name for name in name_groups if name != prev_name]
        # 按剩余元素数量降序排列,优先处理数量多的组
        available_names.sort(key=lambda x: len(name_groups[x]), reverse=True)
        
        # 从剩余数量最多的组别中随机选一个,保证结果随机
        top_count = len(name_groups[available_names[0]])
        candidates = [name for name in available_names if len(name_groups[name]) == top_count]
        chosen_name = random.choice(candidates)
        
        # 取出该组一个元素加入结果
        result.append(name_groups[chosen_name].pop())
        prev_name = chosen_name
        
        # 若该组元素为空,移除该组
        if not name_groups[chosen_name]:
            del name_groups[chosen_name]
    
    return result

# 测试示例
original = [['John', 8], ['John', 8], ['John', 8], ['Mary', 7], ['Mary', 7], ['Mike', 9], ['Mike', 9]]
shuffled_result = shuffle_no_adjacent(original)
print(shuffled_result)

代码说明

  • 用defaultdict完成姓名分组,方便后续批量操作;
  • 提前打乱每组内的元素,确保每次取出的元素是随机的;
  • 优先选择剩余数量最多的组别,避免出现某类元素剩余过多无法放置的情况;
  • 当多个组别剩余数量相同时随机选择,保证最终排序的随机性。

效果验证

运行代码后会输出满足要求的随机结果,例如:

[['John', 8], ['Mary', 7], ['Mike', 9], ['John', 8], ['Mike', 9], ['Mary', 7], ['John', 8]]

多次运行会得到不同的随机排序结果,且始终不会出现相同姓名相邻的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:15:57