基于另一个列表排序列表

时间:2018-06-15 21:36:25

标签: python python-3.x sorting numpy

我在python3.6中有两个列表,我想通过考虑w值来排序d。这与这个问题类似, Sorting list based on values from another list?但我无法使用zip,因为wd不是配对数据。

我有一个代码示例,并希望获得t变量。

更新

我可以通过使用for循环来实现。有没有更快的方式?

import numpy as np

w = np.arange(0.0, 1.0, 0.1)
t = np.zeros(10)
d = np.array([3.1, 0.2, 5.3, 2.2, 4.9, 6.1, 7.7, 8.1, 1.3, 9.4])
ind = np.argsort(d)
print('w', w)
print('d', d)

for i in range(10):
    t[ind[i]] = w[i]

print('t', t)
#w [ 0.   0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9]
#d [ 3.1  0.2  5.3  2.2  4.9  6.1  7.7  8.1  1.3  9.4]
#ht [ 0.3  0.   0.5  0.2  0.4  0.6  0.7  0.8  0.1  0.9]

3 个答案:

答案 0 :(得分:3)

像这样使用argsort

>>> t = np.empty_like(w)
>>> t[d.argsort()] = w
>>> t
array([0.3, 0. , 0.5, 0.2, 0.4, 0.6, 0.7, 0.8, 0.1, 0.9])

答案 1 :(得分:1)

他们配对数据,但方向相反。

  • 制作第三个列表i,np.arange(0,10)。
  • zip这与d
  • 使用d作为排序键对元组进行排序; i仍保留每个d元素的原始索引。
  • zip这与w
  • 使用i作为排序键,对三元组进行排序(好,成对配对为一个元素)。
  • 按新订单提取w个值;这是您的t数组。

答案 2 :(得分:1)

这个问题的答案非常棒,但我觉得谨慎地指出你没有做你认为自己在做的事情。

您想要做什么: (或至少我收集的内容)您希望t包含重新排列为w的值按照d

的排序顺序排列

您正在做什么:按t的排序顺序填写d,其元素为w。您只是更改t填充方式的顺序。您没有在d

上将w反映到t

考虑for循环中的一个小变化

for i in range(0,10):
    t[i] = w[ind[i]]

这会输出t

('t', array([0.1, 0.8, 0.3, 0. , 0.4, 0.2, 0.5, 0.6, 0.7, 0.9]))

你也可以适应PaulPanzer的答案。