python实现将给定列表划分为元素和大致相等的两个子列表

简介: python实现将给定列表划分为元素和大致相等的两个子列表

正文


假设现有列表[300,150,75,38,19,9,5,2],我想把它划分为两个子列表,并要求两个列表的元素和大致相等,应该如何做?

这是一个很有意思的问题,我们期待的答案应该是:

list1: [300]
list2: [150,75,38,19,9,5,2]

在写这篇博客之前,我已经浏览了 Together_CZ 的答案,他的思路是:元素和较大的列表与元素和较小的列表的差值大于元素和较大列表中的最小元素的时候,需要弹出最小元素加入的元素和较小列表当中。


但该答案实际上是对列表进行重分配,而不是“划分”,如果我仅仅只是想将一个列表前后切分成元素和大致相等的两个子列表,并且保持元素顺序不变化,应该怎么做呢?实际上只需要一些小小的改动就可以了。

def list_split(one_list):
    ''' 将给定的列表划分为元素和大致相当的两个子列表 '''
    num_list = copy.deepcopy(one_list[:]) # 原列表深拷贝
    first_list = [] # 列表构建
    second_list = [] # 列表构建
    # ------ 将原列表划分为元素和大致相对的两个子列表 ------ #
    first_list.append(num_list.pop(0)) # 列表初始化
    second_list.append(num_list.pop(-1)) # 列表初始化
    while len(num_list) != 0: # 若原列表中还有元素
        if sum(first_list) >= sum(second_list): # 若first列表中元素和大于second列表
            second_list.insert(0, num_list.pop(-1)) # 在头部插入
        else:
            first_list.append(num_list.pop(0)) # 在尾部添加
    return first_list, second_list # 返回
if __name__ == "__main__":
  first_list, second_list = list_split([300,150,75,38,19,9,5,2])
  print(first_list)
  print(second_list)

输出:

[300]
[150,75,38,19,9,5,2]

可以看到,子列表的顺序和在原列表中是一样的。

再试一个元素值间隔比较小的list:

# 代码:
first_list, second_list = list_split([300, 299, 298, 297, 296, 295, 294, 293])
print(first_list)
print(second_list)
# 输出:
[300, 299, 298, 297]
[296, 295, 294, 293]
, 294, 293

再试一个乱序的list:

first_list, second_list = list_split([3, 12, 5, 9, 1, 7, 4])
print(first_list)
print(second_list)
# 输出:
[3, 12, 5]
[9, 1, 7, 4]
相关文章
|
2天前
|
Python
【Python操作基础】——列表操作
【Python操作基础】——列表操作
|
2天前
|
索引 Python
Python中的列表、元组和字典各具特色
Python中的列表、元组和字典各具特色:列表是可变的,元组不可变,字典亦可变;列表和元组有序,字典无序(但在Python 3.7+保持插入顺序);元素类型上,列表和元组元素任意,字典需键不可变;列表用方括号[],元组用圆括号(),字典用大括号{}表示。列表不适合作字典键,元组可以。选择数据结构应依据实际需求。
7 2
|
6天前
|
BI Python
深入浅出:讲解Python中的列表推导式
深入浅出:讲解Python中的列表推导式
|
6天前
|
监控 PHP Python
1688快速获取整店铺列表 采集接口php Python
在电子商务的浪潮中,1688平台作为中国领先的批发交易平台,为广大商家提供了一个展示和销售商品的广阔舞台;然而,要在众多店铺中脱颖而出,快速获取商品列表并进行有效营销是关键。
|
7天前
|
算法 Python
Python中不使用sort对列表排序的技术
Python中不使用sort对列表排序的技术
17 1
|
7天前
|
Python
【Python 基础】列表(list)和元组(tuple)有什么区别?
【5月更文挑战第6天】【Python 基础】列表(list)和元组(tuple)有什么区别?
|
7天前
|
算法 Python
从原始边列表到邻接矩阵:使用Python构建图的表示
从原始边列表到邻接矩阵:使用Python构建图的表示
9 0
|
7天前
|
机器学习/深度学习 存储 数据挖掘
Python中遍历并修改列表的综合指南
Python中遍历并修改列表的综合指南
15 2
|
7天前
|
机器学习/深度学习 自然语言处理 Python
python分词列表转化成词向量
python分词列表转化成词向量
12 1
|
7天前
|
算法 数据处理 Python
Python技术分享:如何将数据列表中的空值补0
Python技术分享:如何将数据列表中的空值补0
14 1