Python如何对元组列表随机打乱且保持元组第二个元素的顺序?
Python元组列表随机打乱且保留元组第二个元素顺序的实现方法
实现思路
核心逻辑是分组打乱再拼接:
- 先将所有元组按第二个元素的值进行分组,第二个元素相同的元组归为同一组
- 对每个分组内部的元组做随机打乱
- 按照第二个元素从小到大的顺序,将所有分组的元素依次拼接,得到最终结果
代码实现
纯Python标准库实现(无需额外安装依赖)
import random from itertools import groupby # 输入元组列表 x = [(1,1), (1,2), (1,3), (2,2), (2,3), (3,1), (3,2), (3,3)] # 先按元组第二个元素排序,保证groupby可以正确分组 sorted_by_sec = sorted(x, key=lambda item: item[1]) result = [] for _, group in groupby(sorted_by_sec, key=lambda item: item[1]): group_list = list(group) # 组内随机打乱 random.shuffle(group_list) result.extend(group_list) print(result)
Numpy版本实现
import numpy as np np.random.seed(41) x = [(1,1), (1,2), (1,3), (2,2), (2,3), (3,1), (3,2), (3,3)] # 获取所有第二个元素的唯一值并按升序排列 sec_values = sorted(set(item[1] for item in x)) result = [] for val in sec_values: # 筛选出当前第二个值对应的所有元组 current_group = [item for item in x if item[1] == val] # 组内打乱 np.random.shuffle(current_group) result.extend(current_group) print(result)
效果说明
运行上述代码后,输出结果会满足:所有第二个元素更小的元组整体排在前面,同一个第二个值对应的元组顺序为随机,完全符合需求。
直接调用全局shuffle不符合要求的原因是全局打乱会破坏第二个元素的分组排序规则,而分组打乱的方案可以在保证第二个元素顺序的前提下,实现第一个元素的随机排序。
内容的提问来源于stack exchange,提问作者Leon Adams
相关产品推荐
相关产品推荐

