排序2个彼此链接的列表

时间:2018-09-30 07:35:16

标签: python python-3.x list sorting

我陷入一个问题,我想不出任何有效的方法来解决这个问题。问题如下:

我有2个列表,每个列表中的n10^3

v = [v_1, v_2, ..., v_n]
w = [w_1, w_2, ..., w_n]

在下面的示例n = 3中。

v = [60, 100 , 120] 
w = [20, 50, 30]

我需要根据以下等式的降序对两个列表进行排序:v_i/w_i

所以在这种情况下,我会得到:

v_1/w_1 = 3
v_2/w_2 = 2
v_3/w_3 = 4

此后,我需要按照降序对两个列表(相互依赖)进行排序,然后得到以下结果。

v_new = [120, 60, 100]
w_new = [30, 20, 50]

我知道有一种sorted(zip(X,Y)的方法,但是这样做会改变我的元组列表,我需要将其作为列表。有什么建议吗?

4 个答案:

答案 0 :(得分:5)

Python的sort函数可以带一个键,您可以使用lambda函数来定义要排序的键。在这种情况下,我建议对索引进行排序,然后将顺序应用于vw。例如:

v = [60, 100 , 120] 
w = [20, 50, 30]
order = sorted(range(len(v)), key=lambda i: v[i] / w[i], reverse=True)

v_new = [v[i] for i in order]
w_new = [w[i] for i in order]

答案 1 :(得分:3)

使用key中的sorted根据条件进行排序,然后给出一个元组列表,我们使用zip将它们分成两个列表:

v = [60, 100 , 120] 
w = [20, 50, 30]

v, w = map(list, zip(*sorted(zip(v, w), key=lambda x: - x[0] / x[1])))

print(v)  # [120, 60, 100]
print(w)  # [30, 20, 50]

或者,您可以在同一代码中使用reverse=True,例如:

v = [60, 100 , 120] 
w = [20, 50, 30]

v, w = map(list, zip(*sorted(zip(v, w), key=lambda x: x[0] / x[1], reverse=True)))

这也会产生所需的结果。

答案 2 :(得分:0)

您可以使用熊猫:

import pandas as pd
v = [60, 100, 120]
w = [20, 50, 30]
vv = pd.Series(v)
ww = pd.Series(w)
new_index = list((vv/ww).sort_values(ascending=False).index.values)
v_new = list(vv.reindex(new_index))
w_new = list(ww.reindex(new_index))
print(v_new)
print(w_new)

输出:

  

[120、60、100]

     

[30,20,50]

答案 3 :(得分:0)

这个问题没有提到numpy,但是我认为我会使用numpy添加一个答案,因为它可以很好地处理这种事情。 Numpy有一个argsort,可用于将任何排序的顺序应用于其他数组,例如:

import numpy as np

v = np.array([60, 100 , 120])
w = np.array([20, 50, 30])

order = np.argsort(v / w)[::-1]
v_new = v[order]
w_new = w[order]

argsort没有一个reverse参数,但是我们总是可以使用[::-1]来反转输出。