python数组升序排序_Python:按x数组升序排序y值数组

这篇博客探讨了如何使用Python对列表进行排序,并利用`enumerate`、`sorted`和`itemgetter`进行优化。作者通过示例展示了如何创建一个装饰器,根据列表中的值对多个列表进行排序,然后使用索引来选择排序后的元素。这种方法在处理大量数据时可能更有效率。
摘要由CSDN通过智能技术生成

我喜欢其他的例子(从中学到了一些东西)。我的答案有点不同:它首先将x项转换为(index,x[index])元组,根据元组中的第二个项对这样的列表进行排序,将索引作为列表输出,并使用索引列表从y列表中选取值。在

如果有更多的像y这样的列表应该根据列表x中的项目顺序进行排序,那么这种方法可能会更有效。在

浓缩版>>> x = [0, 7, 2, 4, 6, 9, 5]

>>> y = [1, 2, 3, 4, 5, 6, 7]

>>> from operator import itemgetter

>>> pick_0 = itemgetter(0)

>>> pick_1 = itemgetter(1)

>>> x_decor = sorted(enumerate(x), key=pick_1)

>>> x_idxs = map(pick_0, x_decor)

>>> multi_picker = itemgetter(*x_idxs)

>>> multi_picker(y)

(1, 3, 4, 7, 5, 2, 6)

让我解释一下,它是如何工作的,为什么在某些情况下它可能是相关的。在

装饰、排序、获取索引、使用它们来选择结果项

首先,获取要使用的值:

^{pr2}$

然后使用enumerate用列表x中的项的索引来修饰值:>>> x_decor = [(idx, val) for idx, val in enumerate(x)]

>>> x_decor

[(0, 0), (1, 7), (2, 2), (3, 4), (4, 6), (5, 9), (6, 5)]

根据值对装饰列表排序(现在是itm[1],因为itm[0]是原始位置索引):>>> x_decor.sort(key=lambda itm: itm[1])

>>> x_decor

[(0, 0), (2, 2), (3, 4), (6, 5), (4, 6), (1, 7), (5, 9)]

最后得到与排序的x相关的位置索引列表:>>> x_idxs = [idx for idx, val in x_decor]

>>> x_idxs

[0, 2, 3, 6, 4, 1, 5]

现在我们使用x_idxs从y列表中选取相关项目:>>> y_vals = [y[idx] for idx in x_idxs]

>>> y_vals

[1, 3, 4, 7, 5, 2, 6]

对于其他列表(如果我们有)可以重复最后一步。在

使用itemgetter优化版本

以前的代码可以使用itemgetter进行优化(为了速度)。在

itemgetter能够创建一个函数,该函数允许从特定位置拾取值。itemgetter还可以创建函数,该函数允许一次从预定义的位置拾取多个值。在>>> from operator import itemgetter

>>> itemgetter(0)

>>> pick_0 = itemgetter(0)

>>> pick_1 = itemgetter(1)

>>> pick_0_2 = itemgetter(0, 2)

让我们看看,这些函数能为我们做些什么:>>> pick_0(["a", "b", "c"])

'a'

>>> pick_1(["a", "b", "c"])

'b'

>>> pick_0_2(["a", "b", "c"])

('a', 'c')

让我们像以前一样创建修饰的x,这次使用的语法要短一些:>>> x_decor = sorted(enumerate(x), key=pick_1)

>>> x_decor

[(0, 0), (2, 2), (3, 4), (6, 5), (4, 6), (1, 7), (5, 9)]

enumerate(x)创建修饰列表,sorted使用key=pick_1根据原始x列表中的值对其进行排序。在

使用pick_0,我们可以从装饰列表中获得索引列表:>>> x_idxs = map(pick_0, x_decor)

>>> x_idxs

[0, 2, 3, 6, 4, 1, 5]

这些索引可用于创建multi_picker(类似于上面的pick_0_2):>>> multi_picker = itemgetter(*x_idxs)

>>> multi_picker

并使用multi_picker从列表y中获得正确排序的元素:>>> y_vals = multi_picker(y)

>>> y_vals

(1, 3, 4, 7, 5, 2, 6)

如果我们有更多的list根据排序的x元素进行排序,multi_picker将是现在唯一调用它们的函数。在

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值