欢迎来到曹鸿源的个人站点
希望我们可以相互学习,谢谢!^o^

       

Python3 列表平均分割(根据线程数等分)

 2019-10-11 23:45:51   {{zan}}   0   90 

工作中遇到长度为 L 列表内容需要根据线程数 N 均匀分割,尽量让每个线程获取差不多数目的任务,也就是把 L 均匀分割成 N 份,而且列表长度和线程数目都是随机的。

例如:

线程数目为 N = 5,需要处理的列表 L:

['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13']

处理后的列表:

[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10', '11'], ['12', '13']]

尽量让 N 个分组包含的元素个数最大相差为1。

代码如下:

#!/usr/bin/python3

import threading
import time
import math

L = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24']
N = 10
# L: list, N: number
def averageList(L, N):
    if len(L) < N:
        return [L[i:i + 1] for i in range(0, len(L), 1)]
    leng_1 = len(L) // N # 整数
    leng_2 = len(L) % N # 余数
    # 前面 leng_2 是组 leng_1 + 1 个元素,剩下后面每组 leng_1 个元素
    _L = []
    L_1 = L[0: leng_2 * (leng_1 + 1)]
    L_2 = L[len(L_1): len(L)]
    _L_1 = [L_1[i : i + leng_1 + 1] for i in range(0, len(L_1), leng_1 + 1)]
    _L_2 = [L_2[i : i + leng_1] for i in range(0, len(L_2), leng_1)]
    return _L_1 + _L_2
print(averageList(L, N))

打印结果如下:

[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10', '11', '12'], ['13', '14'], ['15', '16'], ['17', '18'], ['19', '20'], ['21', '22'], ['23', '24']]

实现思路:

1、列表 L 长度除以 N 获取整数(x)和余数(y),那么就可以:前面一部分每组  x + 1 个元素,后面所有的元素每组 x 个元素;

2、分割列表 L 成前后两部分,然后均分分割,最后拼接即可。

当前N > len(L) 的情况要单独出了。

完毕

本文链接地址,转载请标注:https://caohongyuan.cn/article/129

(邮箱不会公开,只会做回复通知用) 提交 清空 {{comment.content}}
Re:{{response.content}}