如何用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
相关产品推荐
相关产品推荐

