![](/img/trans.png)
[英]Iterating over a sorted list returning more entries than iterating over non-sorted list
[英]Sorting list of lists by a third list of specified non-sorted order
我有一個清單:
[['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ...
我想按照另一個列表指定的順序中的第一個值對這個更大的列表進行排序,該列表按所需順序排列。
通常的習慣是使用密鑰排序:
>>> a = [[1,2],[2,10,10],[3,4,'fred']]
>>> b = [2,1,3]
>>> sorted(a,key=lambda x: b.index(x[0]))
[[2, 10, 10], [1, 2], [3, 4, 'fred']]
但是這可能會出現性能問題 - 如果密鑰是可清除的,那么對於長列表來說這可能會更快:
>>> order_dict = dict(zip(b, range(len(b))))
>>> sorted(a,key=lambda x: order_dict[x[0]])
[[2, 10, 10], [1, 2], [3, 4, 'fred']]
怎么樣:
inputlist = [['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ... # obviously not valid syntax
auxinput = aux = ['75910712', '18411971', ...] # ditto
keyed = { sublist[0]:sublist for sublist in inputlist }
result = [keyed[item] for item in auxinput]
這里不需要使用排序。 對於大型列表,這會更快,因為它是O(n)
而不是O(n * log n)
。
如果鍵不是唯一的,則可以使用有序字典的某些變體(例如,根據Niklas B的建議的defaultdict(list)
)來構建鍵控表示。
所以,如果我理解你,你有你的樣本輸入列表:
a = [['18411971', 'kinase_2', 36], ['75910712', 'unnamed...', 160], ...
並且您希望使用額外的列表對此進行排序,該列表提到了子列表的第一個元素在輸出中出現的順序:
aux = ['75910712', '18411971', ...]
如果這是正確的,我認為結果可以通過以下方式實現:
sorted(a, key = lambda x: aux.index(x[0]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.