說明
有時候需要随機對一個清單進行切分,傳回多個子清單,這裡寫一個函數
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]}