天天看點

Python:将清單随機切分成若幹部分

說明

有時候需要随機對一個清單進行切分,傳回多個子清單,這裡寫一個函數

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]}