Python双字段列表仅按第1字段升序、第0字段每次运行随机打乱实现方法
多字段列表排序+同组随机打乱解决方案
核心思路
无需对全列表执行shuffle(会破坏字段1的排序规则),仅需要保证字段1值相同的元素组内随机打乱即可,提供两种可直接用的实现方案:
方案1:调整排序key(最简洁)
排序时将第二排序维度替换为随机浮点数,同字段1的元素会按随机值排序,实现每次运行字段0自动打乱的效果:
import random most_frequent_sorted = sorted( most_frequent, key=lambda x: (x[1], random.random()), reverse=False )
注意:
random.random()必须写在lambda函数内部,保证每个元素的随机key独立生效。如果习惯用operator.itemgetter,也可以把x[1]替换为operator.itemgetter(1)(x),效果完全一致。
方案2:分组后打乱再拼接(逻辑更直观)
先按字段1升序完成全量排序,再按字段1分组对每个组单独执行shuffle,最后按顺序拼接所有组即可:
import itertools import random import operator # 第一步:先按字段1完成升序排序 sorted_by_field1 = sorted(most_frequent, key=operator.itemgetter(1)) most_frequent_sorted = [] # 第二步:按字段1分组,组内打乱后拼接 for _, group in itertools.groupby(sorted_by_field1, key=operator.itemgetter(1)): group_list = list(group) random.shuffle(group_list) most_frequent_sorted.extend(group_list)
该方案性能更稳定,适合处理元素量级较大的列表场景。
内容的提问来源于stack exchange,提问作者Ajmul
相关产品推荐
相关产品推荐

