python列表按大小排列顺序_python系列(bisect-按排序顺序排列列表)

该bisect模块实现了一种算法,用于将元素插入列表,同时按排序顺序维护列表。

以排序顺序插入

这是一个简单的示例,insort()用于按排序顺序将项目插入列表。

bisect_example.py

import bisect

# A series of random numbers

values = [14, 85, 77, 26, 50, 45, 66, 79, 10, 3, 84, 77, 1]

print('New Pos Contents')

print('--- --- --------')

l = []

for i in values:

position = bisect.bisect(l, i)

bisect.insort(l, i)

print('{:3} {:3}'.format(i, position), l)

输出的第一列显示新的随机数。第二列显示数字将插入列表的位置。每行的其余部分是当前排序列表。

$ python3 bisect_example.py

New Pos Contents

--- --- --------

14 0 [14]

85 1 [14, 85]

77 1 [14, 77, 85]

26 1 [14, 26, 77, 85]

50 2 [14, 26, 50, 77, 85]

45 2 [14, 26, 45, 50, 77, 85]

66 4 [14, 26, 45, 50, 66, 77, 85]

79 6 [14, 26, 45, 50, 66, 77, 79, 85]

10 0 [10, 14, 26, 45, 50, 66, 77, 79, 85]

3 0 [3, 10, 14, 26, 45, 50, 66, 77, 79, 85]

84 9 [3, 10, 14, 26, 45, 50, 66, 77, 79, 84, 85]

77 8 [3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85]

1 0 [1, 3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85]

这是一个简单的例子。事实上,考虑到被操纵的数据量,简单地构建列表然后对其进行一次排序可能会更快。相比之下,对于长列表,使用诸如此类的插入排序算法可以实现显着的时间和存储器节省,尤其是当比较列表的两个成员的操作需要昂贵的计算时。

处理重复

先前显示的结果集包括重复值,77。该 bisect模块提供了两种处理重复的方法:可以将新值插入现有值的左侧,也可以插入右侧。该insort()函数实际上是一个别名 insort_right(),它在现有值之后插入一个项目。相应的函数insort_left()在现有值之前插入一个项。

bisect_example2.py

import bisect

# A series of random numbers

values = [14, 85, 77, 26, 50, 45, 66, 79, 10, 3, 84, 77, 1]

print('New Pos Contents')

print('--- --- --------')

# Use bisect_left and insort_left.

l = []

for i in values:

position = bisect.bisect_left(l, i)

bisect.insort_left(l, i)

print('{:3} {:3}'.format(i, position), l)

当使用bisect_left()和 操作相同的数据时insort_left(),结果是相同的排序列表,但插入位置对于重复值是不同的。

$ python3 bisect_example2.py

New Pos Contents

--- --- --------

14 0 [14]

85 1 [14, 85]

77 1 [14, 77, 85]

26 1 [14, 26, 77, 85]

50 2 [14, 26, 50, 77, 85]

45 2 [14, 26, 45, 50, 77, 85]

66 4 [14, 26, 45, 50, 66, 77, 85]

79 6 [14, 26, 45, 50, 66, 77, 79, 85]

10 0 [10, 14, 26, 45, 50, 66, 77, 79, 85]

3 0 [3, 10, 14, 26, 45, 50, 66, 77, 79, 85]

84 9 [3, 10, 14, 26, 45, 50, 66, 77, 79, 84, 85]

77 7 [3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85]

1 0 [1, 3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值