使用另一个更大的列表的顺序对python列表进行排序

时间:2013-05-30 16:51:41

标签: python list sorting

我有2个列表,例如:

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

我想按列表a的顺序对列表b中的公共元素进行排序,得到这样的结果:

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

我已经使用sorted()阅读了类似的问题,但是当列表中不包含相同的元素(例如列表'dog'中的b)时,我无法使其工作。

4 个答案:

答案 0 :(得分:4)

>>> 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']

答案 1 :(得分:2)

我将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)与列表.index()查找费用O(n)。当ab的大小增加时,您会注意到这一点。

缺点是a中的重复值的处理方式不同; dict方法选择最后一个索引而不是.index()选择第一个索引。

答案 2 :(得分:0)

您可以使用(冻结)套装。我还没有把时间与其他答案对决。

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

答案 3 :(得分:0)

一种选择是使用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']