我陷入一个问题,我想不出任何有效的方法来解决这个问题。问题如下:
我有2个列表,每个列表中的n
至10^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)的方法,但是这样做会改变我的元组列表,我需要将其作为列表。有什么建议吗?
答案 0 :(得分:5)
Python的sort函数可以带一个键,您可以使用lambda函数来定义要排序的键。在这种情况下,我建议对索引进行排序,然后将顺序应用于v
和w
。例如:
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]
来反转输出。