Python:将列表随机切分成若干部分

说明

有时候需要随机对一个列表进行切分,返回多个子列表,这里写一个函数split_list来实现这个功能。

代码

下面实现了两个函数,subsetsplit_list,其中subset用来从列表中取出指定下标的元素,而split_list则用来随机切分列表成几等份。

import random

def subset(alist, idxs):
    '''
        用法:根据下标idxs取出列表alist的子集
        alist: list
        idxs: list
    '''
    sub_list = []
    for idx in idxs:
        sub_list.append(alist[idx])

    return sub_list

def split_list(alist, group_num=4, shuffle=True, retain_left=False):
    '''
        用法:将alist切分成group个子列表,每个子列表里面有len(alist)//group个元素
        shuffle: 表示是否要随机切分列表,默认为True
        retain_left: 若将列表alist分成group_num个子列表后还要剩余,是否将剩余的元素单独作为一组
    '''

    index = list(range(len(alist))) # 保留下标

    # 是否打乱列表
    if shuffle: 
        random.shuffle(index) 
    
    elem_num = len(alist) // group_num # 每一个子列表所含有的元素数量
    sub_lists = {}
    
    # 取出每一个子列表所包含的元素,存入字典中
    for idx in range(group_num):
        start, end = idx*elem_num, (idx+1)*elem_num
        sub_lists['set'+str(idx)] = subset(alist, index[start:end])
    
    # 是否将最后剩余的元素作为单独的一组
    if retain_left and group_num * elem_num != len(index): # 列表元素数量未能整除子列表数,需要将最后那一部分元素单独作为新的列表
        sub_lists['set'+str(idx+1)] = subset(alist, index[end:])
    
    return sub_lists

用法示例如下:
每一句代码后面是该代码的输出结果

print(split_list(range(10), group_num=4, retain_left=False)) # 随机分成4组,retain_left默认是False
结果:{'set0': [8, 6], 'set1': [0, 5], 'set2': [3, 2], 'set3': [4, 1]}

print(split_list(range(10), group_num=3, retain_left=False)) # 随机分成3组,最后多余的元素扔掉不要
结果:{'set0': [9, 5, 8], 'set1': [6, 3, 4], 'set2': [2, 7, 1]}

print(split_list(range(10), group_num=3, retain_left=True)) # 随机分成3组,最后多余的元素单独作为第4组(set3)
结果:{'set0': [4, 2, 1], 'set1': [3, 0, 5], 'set2': [6, 9, 8], 'set3': [7]}

你可能感兴趣的:(Python学习)