加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

基于python中嵌套列表中的列表之一进行排序

发布时间:2020-12-20 12:20:55 所属栏目:Python 来源:网络整理
导读:我有一个列表[[4,5,6],[2,3,1]].现在我想基于列表[1]对列表进行排序,即输出应该是[[6,4,5],[1,2,3]].所以基本上我正在排序2,1并维护list [0]的顺序. 在搜索时,我得到了一个基于每个列表的第一个元素进行排序的函数,但不是为此.另外,我不想将列表重新创建为[[
我有一个列表[[4,5,6],[2,3,1]].现在我想基于列表[1]对列表进行排序,即输出应该是[[6,4,5],[1,2,3]].所以基本上我正在排序2,1并维护list [0]的顺序.

在搜索时,我得到了一个基于每个列表的第一个元素进行排序的函数,但不是为此.另外,我不想将列表重新创建为[[4,2],[5,3],[6,1]],然后使用该函数.

解决方法

由于[4,6]和[2,1]有两个不同的目的,我将创建一个带有两个参数的函数:要重新排序的列表,以及排序将决定顺序的列表.我只会返回重新排序的列表.

This answer具有三种不同解决方案的时序,用于创建排序的排列列表.使用最快的选项提供此解决方案:

def pyargsort(seq):
    return sorted(range(len(seq)),key=seq.__getitem__)

def using_pyargsort(a,b):
    "Reorder the list a the same way as list b would be reordered by a normal sort"
    return [a[i] for i in pyargsort(b)]                     

print using_pyargsort([4,1])    # [6,5]

pyargsort方法的灵感来自numpy argsort方法,它可以更快地完成同样的事情. Numpy还具有高级索引操作,可以将数组用作索引,从而可以非常快速地重新排序数组.

因此,如果您对速度的需求很大,那么可以假设这个numpy解决方案会更快:

import numpy as np

def using_numpy(a,b):
    "Reorder the list a the same way as list b would be reordered by a normal sort"
    return np.array(a)[np.argsort(b)].tolist()

print using_numpy([4,1])     # [6,5]

但是,对于短列表(长度<1000),该解决方案实际上比第一个慢.这是因为我们首先将a和b列表转换为数组,然后在返回之前将结果转换回列表.如果我们假设你在整个应用程序中使用numpy数组,这样我们就不需要来回转换了,我们得到了这个解决方案:

def all_numpy(a,b):
    "Reorder array a the same way as array b would be reordered by a normal sort"
    return a[np.argsort(b)]

print all_numpy(np.array([4,6]),np.array([2,1]))    # array([6,5])

all_numpy函数的执行速度比using_pyargsort函数快10倍.

以下对数图将这三种解决方案与其他答案中的两种替代解决方案进行了比较.参数是两个等长的随机混洗范围,并且函数都接收相同排序的列表.我只计算函数执行的时间.为了说明的目的,我为每个numpy解决方案添加了额外的图形行,其中加载numpy的60 ms开销被添加到时间.

正如我们所看到的,这种全能的解决方案比其他解决方案高出一个数量级.从python列表转换回来会大大降低using_numpy解决方案的速度,相比之下,它仍然比大型列表的纯python更好.

对于大约1’000’000的列表长度,using_pyargsort需要2.0秒,using_nympy开销仅为1.3秒,而all_numpy开销为0.3秒.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读