python数组升序排序_Python:按x数组升序排序y值数组我喜欢其他的例⼦(从中学到了⼀些东西)。我的答案有点不同:它⾸先将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}$python 定义数组
然后使⽤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将是现在唯⼀调⽤它们的函数。在
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论