Python技术问询:如何实现将列表随机划分为n个子列表
Python实现将列表随机划分为n个子列表的函数
完整实现代码
import random def split_randomly(lst, n): # 复制原列表并打乱,避免修改输入的原列表 shuffled = lst.copy() random.shuffle(shuffled) # 生成n-1个随机分割点(允许重复,范围0到列表长度) splits = sorted(random.choices(range(len(shuffled) + 1), k=n-1)) # 构造完整的分割点序列:起始0,中间分割点,结尾为列表长度 split_points = [0] + splits + [len(shuffled)] # 通过切片生成子列表 return [shuffled[split_points[i]:split_points[i+1]] for i in range(n)]
代码解释
- 列表打乱:先用
lst.copy()复制原列表,再用random.shuffle()打乱。直接用shuffle会原地修改原列表,复制后能保证原数据不受影响。 - 生成分割点:用
random.choices()生成n-1个允许重复的整数(范围是0到len(shuffled)),这样可以产生空列表的情况(比如分割点重复为0时,第一个子列表就是空的)。之后对分割点排序,确保切片顺序正确。 - 切片生成子列表:把
0、排序后的分割点、列表长度组合成完整的分割序列,通过遍历分割序列的相邻元素,对打乱后的列表进行切片,得到n个子列表。
纠正你之前的shuffle函数问题
你写的shuffle_list函数有问题:random.shuffle()是原地修改列表,返回值为None,所以直接return它会得到None。正确的写法应该是:
import random def shuffle_list(lst): shuffled = lst.copy() random.shuffle(shuffled) return shuffled
测试示例
# 示例1 print(split_randomly([1,1,4,8,5,5], 3)) # 可能输出:[[5,8], [1], [1,5,4]](结果随机,符合要求即可) # 示例2 print(split_randomly([77, 88, 3], 2)) # 可能输出:[[], [3,77,88]](结果随机,符合要求即可)
内容的提问来源于stack exchange,提问作者GrueEmerald
相关产品推荐
相关产品推荐

