我喜欢其他的例子(从中学到了一些东西)。我的答案有点不同:首先将x
项转换为(索引,x [index])元组,根据元组中的第2项对这样的列表进行排序,获取索引作为列表,并使用索引列表从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 = [0, 7, 2, 4, 6, 9, 5]
>>> y = [1, 2, 3, 4, 5, 6, 7]
然后使用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)
<operator.itemgetter at 0x7f8e300afd90>
>>> 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
<operator.itemgetter at 0x7f8e300afb10>
使用multi_picker
从列表y
中获取正确排序的元素:
>>> y_vals = multi_picker(y)
>>> y_vals
(1, 3, 4, 7, 5, 2, 6)
如果我们有更多的列表需要根据已排序的
x
元素进行排序,那么现在只需要调用
multi_picker
函数即可。
sorted
一个key
可能会稍微提高运行效率。 - inspectorG4dget