簡體   English   中英

如何根據python中的列表列表對列表進行排序?

[英]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和從添加值bdefaultdict ,然后更改keysortedb_dict[x]這將根據與相關聯的值進行排序xb ,如果該值不存在於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"]

速度明智:

  1. @Moe A使用dict.get(x, 0)的答案,其時間值為2.42482

  2. @abccd的答案(我的)使用defaultdict ,其timeit值為2.88044

  3. @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM