簡體   English   中英

按另一個較大列表的順序對python列表進行排序

[英]Sort python list with order of another, larger list

我有2個列表,例如:

a = ['a','b','c','d','e']
b = ['c','a','dog']

我想按列表a的順序對列表b中的公共元素進行排序,以獲得如下所示的內容:

['a','c','dog']

我已經使用sorted()閱讀了類似的問題,但是當列表中不包含相同元素(即列表b 'dog' sorted() ,我無法使其工作。

>>> a = ['a','b','c','d','e']
>>> b = ['c','a','dog']
>>> def func(x):
...     try:
...         return a.index(x)
...     except ValueError:
...         return float("inf")
...     
>>> sorted(b, key = func)
['a', 'c', 'dog']

我將把a變成字典:

a_dict = dict((v, i) for i, v in enumerate(a))

並使用float('inf')表示要在末尾排序的值:

sorted(b, key=lambda v: a_dict.get(v, float('inf')))

演示:

>>> a = ['a','b','c','d','e']
>>> b = ['c','a','dog']
>>> a_dict = dict((v, i) for i, v in enumerate(a))
>>> sorted(b, key=lambda v: a_dict.get(v, float('inf')))
['a', 'c', 'dog']

這具有速度優勢; dict查找是O(1)與具有O(n)成本的.index()查找。 隨着ab增加,您會注意到更多。

缺點是對a中的重復值a處理方式不同。 dict方法選擇最后一個索引,而.index()選擇第一個。

您可以使用(凍結)集。 我還沒有針對其他答案設置時間。

>>> a = ['a','b','c','d','e']
>>> b = ['c','a','dog']
>>> list((frozenset(a)^frozenset(b))^frozenset(a))
['a', 'c', 'dog']

一種選擇是使用bisect

import bisect
from operator import itemgetter
a = ['a','b','c','d','e']
b = ['c','a','dog']
l = sorted([(x, bisect.bisect(a, x)) for x in b], key=itemgetter(1))
l = [x[0] for x in l]
print l
['a', 'c', 'dog']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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