说明
有时候需要随机对一个列表进行切分,返回多个子列表,这里写一个函数split_list
来实现这个功能。
代码
下面实现了两个函数,subset
与 split_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]}