首页 > 编程语言 >Python把列表中的数字尽量等分成n份

Python把列表中的数字尽量等分成n份

时间:2023-06-09 21:06:54浏览次数:40  
标签:分成 Python sum 元素 列表 lst print partitions


问题描述:假设一个列表中含有若干整数,现在要求将其分成n个子列表,并使得各个子列表中的整数之和尽可能接近。

下面的代码并没有使用算法,而是直接将原始列表分成n个子列表,然后再不断地调整各个子列表中的数字,从元素之和最大的子列表中拿出最小的元素放到元素之核最小的子列表中,重复这个过程,知道n个子列表足够接近为止。

import random
def numberSplit(lst, n, threshold):
    '''lst为原始列表,内含若干整数,n为拟分份数
       threshold为各子列表元素之和的最大差值'''
    length = len(lst)
    p = length // n
    #尽量把原来的lst列表中的数字等分成n份
    partitions = []
    for i in range(n-1):
        partitions.append(lst[i*p:i*p+p])
    else:
        partitions.append(lst[i*p+p:])
    print('初始分组结果:', partitions)
    
    #不停地调整各个子列表中的数字
    #直到n个子列表中数字之和尽量相等
    times = 0
    while times < 1000:
        times += 1
        #元素之和最大的子列表和最小的子列表
        maxLst = max(partitions, key=sum)
        minLst = min(partitions, key=sum)
        #把大的子列表中最小的元素调整到小的子列表中
        m = min(maxLst)
        i = [j for j, v in enumerate(maxLst) if v==m][0]
        minLst.insert(0, maxLst.pop(i))
        print('第{0}步处理结果:'.format(times), partitions)
        first = sum(partitions[0])
        for item in partitions[1:]:
            if abs(sum(item)-first) > threshold:
                break
        else:
            break
    else:
        print('很抱歉,我无能为力,只能给出这样一个结果了。')
    return partitions
lst = [random.randint(1, 100) for i in range(10)]
print(lst)
result = numberSplit(lst, 3, 5)
print('最终结果:', result)
#输出各组数字之和
print('各子列表元素之和:')
for item in result:
    print(sum(item))

运行结果一:

Python把列表中的数字尽量等分成n份_java

运行结果二:

Python把列表中的数字尽量等分成n份_数据结构_02

运行结果三:

Python把列表中的数字尽量等分成n份_算法_03

标签:分成,Python,sum,元素,列表,lst,print,partitions
From: https://blog.51cto.com/u_9653244/6451059

相关文章

  • Python中enumerate对象的用法与特点
    Python的内置函数enumerate()函数用来枚举可迭代对象中的元素,返回可迭代的enumerate对象,其中每个元素都是包含索引和值的元组。#枚举字符串中的元素>>>list(enumerate('abcd'))[(0,'a'),(1,'b'),(2,'c'),(3,'d')]#枚举列表中的元素>>>list(enumerate([�......
  • Python从命令行参数和配置文件获取信息
    实际开发中,很多时候需要从外部获取数据,根据用户的输入或配置信息来决定下一步应采取的行为。除了使用内置函数input()或者GUI库的控件和对话框来接收用户输入以外,还可以使用sys和argparse模块来接收命令行参数,使用configparser模块从外部配置文件中获取信息。sys模块的argv是一个包......
  • Python查找任意字符串中只出现一次的字符(2016奇虎笔试题)
    '''  程序功能:  编写函数,给定任意字符串,找出其中只出现一次的字符,  如果有多个这样的字符,就全部找出。'''importsysdefsearchOne(s):#创建空字典d=dict()#遍历字符串,并分别记录每个字符的出现次数forchins:#这里重点演示字典的ge......
  • 小议Python列表和元组中的元素地址连续性
    众所周知,在Python中字典和集合依赖元素哈希表来存储,并不存在传统意义上的所谓元素“顺序”,当然,如果需要一个有序的字典可以使用collections模块提供的OrderedDict类。在Python中,列表和元组属于有序序列,支持下标随机访问,也支持切片操作。当然,列表是可变序列而元组属于不可变序列,这一......
  • Python实现倒计时按钮
    很多网站会在注册或交易后给出一个许可协议或提醒信息,一般页面上会有个按钮,但是这个按钮是倒计时的,在倒计时结束之前是禁用的。本文使用tkinter模拟了这样的倒计时按钮。importtkinterimporttimeimportthreading#创建应用程序窗口,设置标题和大小root=tkinter.Tk()root.tit......
  • Python组合列表中多个整数得到最小整数(一个算法的巧妙实现)
    '''程序功能:  给定一个含有多个整数的列表,将这些整数任意组合和连接,  返回能得到的最小值。  代码思路:  将这些整数变为相同长度(按最大的进行统一),短的右侧使用个位数补齐  然后将这些新的数字升序排列,将低位补齐的数字删掉,  把剩下的数字连接起来,即可得到满足要......
  • Python中提供的各种队列结构
    Python标准库queue提供了LILO队列类Queue、LIFO队列类LifoQueue、优先级队列类PriorityQueue,标准库collections提供了双端队列。例如:>>>fromqueueimportQueue#LILO队列>>>q=Queue()#创建队列对象>>>q.put(0)#在队列尾部插入元素>>>q.put(1)>>>q.put(2)>&......
  • Python编写编程作业批量自动打分程序的思路与实现
    总体思路:把接口明确地告诉学生(本文后面的代码要求学生程序中必须有个函数叫做searchOnede),然后学生把Python程序文件(学号_姓名.py)以任何方式提交给老师,放到同一文件夹中。下面的代码首先由老师编写一个自己认为的最佳和最优实现,然后把学生的程序文件作为模块导入并调用其中的searchO......
  • 详解Python中的位运算符规则、原理与用法
    在Python中,位运算符包括位与(&)、位或(|)、位求反(~)、位异或(^)、左移位(<<)和右移位(>>)。1.运算方法与规则位运算符只能适用于整数,其总体运算规则为:首先把整数转换为二进制表示形式,按最低位对齐,短的高位补0,然后进行位运算,最后把得到的二进制转换为十进制数。位与运算符运算规则:0&0=0&1=1&0=......
  • Python批量Excel文件数据导入SQLite数据库的优化方案
    说明:1)需要安装扩展库openpyxl;2)随着数据库的增大,导入速度可能会有所下降;3)本文只考虑Python代码优化,没有涉及数据库的优化;4)本文要点在于使用executemany实现批量数据导入,通过减少事务提交次数提高导入速度。fromrandomimportchoice,randrangefromstringimportdigits,ascii......