假設我有一個嵌套串列:
list = [[10, 2, 8, 4], [12, 6, 4, 1], [8, 4, 3, 2], [9, 3, 4, 6]]
我想對子串列中的元素進行相互排名,以創建一個帶有排名的新嵌套串列。
result = [[1, 4, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4], [1, 4, 3, 2]]
在第一個子串列中,10 將是 1st、8 2nd 等。
uj5u.com熱心網友回復:
正如評論中已經提到的,您可以使用numpy.argsort,使用它兩次可以為您提供值的排名,需要從len子串列中減去以從最高到最低排名,您可以使用 List-Comprehension 為所有子串列。
>>> import numpy as np
>>> lst = [[10, 2, 8, 4], [12, 6, 4, 1], [8, 4, 3, 2], [9, 3, 4, 6]]
>>> [(len(sub)-np.argsort(sub).argsort()).tolist() for sub in lst]
[[1, 4, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4], [1, 4, 3, 2]]
你甚至可以使用 2D numpy 陣列并取反值,然后argsort在結果陣列上直接呼叫兩次,最后加 1:
>>> (-np.array(lst)).argsort().argsort() 1
array([[1, 4, 2, 3],
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 4, 3, 2]], dtype=int64)
uj5u.com熱心網友回復:
您可以使用scipy.stats.rankdata:
my_list = [[10, 2, 8, 4], [12, 6, 4, 1], [8, 4, 3, 2], [9, 3, 4, 6]]
from scipy.stats import rankdata
[list(len(l) 1-rankdata(l).astype(int)) for l in my_list]
輸出:
[[1, 4, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4], [1, 4, 3, 2]]
uj5u.com熱心網友回復:
沒有numpy/ scipy:
[[sorted(li, reverse=True).index(x) 1 for x in li] for li in data]
[[1, 4, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4], [1, 4, 3, 2]]
uj5u.com熱心網友回復:
另一個沒有外部庫的解決方案,并且具有更好的時間復雜度,以防萬一您的子串列比 4 個專案長一點(這有一些開銷,但我認為它是 O(n log n) 因為呼叫sorted)。
def rank_all(ls):
result = []
for subls in ls:
pairs = sorted([(subls[j],j) for j in range(len(subls))], reverse=True)
ranked = [0] * len(subls)
for j,p in enumerate(pairs):
ranked[p[1]]=j 1
result.append(ranked)
return result
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327234.html
下一篇:如何使輸出回傳一個數字?
