gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:28:41 26 4
gpt4 key购买 nike

我有一个列表为 [[4,5,6],[2,3,1]]。现在我想根据 list[1] 对列表进行排序,即输出应该是 [[6,4,5],[1,2,3]]。所以基本上我正在对 2,3,1 进行排序并维护 list[0] 的顺序。

在搜索时我得到了一个函数,它根据每个列表的第一个元素排序,但不是这个。我也不想将列表重新创建为 [[4,2],[5,3],[6,1]] 然后使用该函数。

最佳答案

因为 [4, 5, 6][2, 3, 1] 有两个不同的目的,我将制作一个函数两个 arguments:要重新排序的列表,以及排序将决定顺序的列表。我只会返回重新排序的列表。

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, 5, 6], [2, 3, 1]) # [6, 4, 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, 5, 6], [2, 3, 1]) # [6, 4, 5]

但是,对于短列表(长度 < 1000),此解决方案实际上比第一个要慢。这是因为我们首先将 ab 列表转换为 array,然后将结果转换回 list 返回前。如果我们假设您在整个应用程序中都使用 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, 5, 6]), np.array([2, 3, 1])) # array([6, 4, 5])

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

以下对数图将这三个解决方案与其他答案中的两个备选解决方案进行了比较。参数是两个随机打乱的等长范围,函数都接收相同顺序的列表。我只计时函数执行所需的时间。出于说明目的,我为每个 numpy 解决方案添加了一条额外的图表线,其中加载 numpy 的 60 毫秒开销被添加到时间中。

enter image description here

正如我们所见,全 numpy 解决方案比其他解决方案高出一个数量级。相比之下,从 python list 转换回来会大大降低 using_numpy 解决方案的速度,但对于大型列表,它仍然优于纯 python。

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

关于python - 基于python中嵌套列表中的列表之一进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12368231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com