[英]How to sort a list according to a list of lists in python?
我有一個清單:
a = ["x", "y", "z"]
我還有另一個清單清單:
b = [["y", 99], ["w", 65], ["z", 150]]
所以,我想以按項目a
,根據該值b
降序排列,因此排序的a
應該是這樣的:
sorted_a = ["z", "y", "x"]
這里的"x"
在最后,因為在b
中沒有值。
我想知道實現此目標的最快方法,因為我的真實名單很多。
您可以將b
轉換為字典,並使用dict.get()
作為默認值0的鍵進行排序,例如:
a = ["x", "y", "z"]
b = [["y", 99], ["w", 65], ["z", 150]]
lowest = float('-inf')
tmp = dict(b)
sorted_a = sorted(a, key=lambda x: tmp.get(x, lowest), reverse=True)
# sorted_a = ["z", "y", "x"]
編輯:
為了避免在具有負數時出現錯誤的結果,我將.get()
的默認值更改為-inf
以便b
不存在的元素在排序列表中排在最后。 如果b
沒有負值tmp.get(x, 0)
則將其保留為tmp.get(x, 0)
。
你可以使用一個defaultdict
和從添加值b
到defaultdict
,然后更改key
的sorted
到b_dict[x]
這將根據與相關聯的值進行排序x
在b
,如果該值不存在於b
,默認值為0
,因此它將排在最后。
from collections import defaultdict
a = ["x", "y", "z"]
b = [["y", 99], ["w", 65], ["z", 150]]
b_dict = defaultdict(int, b)
sorted_a = sorted(a, key=lambda x: b_dict[x], reverse=True)
print(sorted_a)
# ["z", "y", "x"]
@Moe A使用dict.get(x, 0)
的答案,其時間值為2.42482
@abccd的答案(我的)使用defaultdict
,其timeit值為2.88044
@RomanPerekhrest的答案使用兩個sorted
函數,其timeit值為2.97899
我想知道實現這一目標的最快方法
然后,我建議使用@Moe A的答案,因為它是到目前為止最快,最簡單的三個方法。
具有sorted
功能:
a = ["x", "y", "z"]
b = [["y", 99], ["w", 65], ["z", 150]]
b_sorted = [i[0] for i in sorted(b, key=lambda x: x[1], reverse=True)]
a_sorted = sorted(a, key=lambda x: b_sorted.index(x) if x in b_sorted else len(a))
print(a_sorted)
輸出:
['z', 'y', 'x']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.