Python:將列表隨機切分成若干部分

水木的程式設計那些事兒發表於2020-10-02

說明

有時候需要隨機對一個列表進行切分,返回多個子列表,這裡寫一個函式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: 
        index = _index.copy()
        random.shuffle(index) # shuffle會改變index的內容,因此需要設定保留下標_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]}

相關文章