我有 2 个列表,例如:
a = ['a','b','c','d','e']
b = ['c','a','dog']
我想按列表 a 的顺序对列表 b 中的常见元素进行排序,得到如下结果:
['a','c','dog']
我已经使用 阅读了类似的问题,但是当列表不包含相同的元素(即在 list 中)sorted()
时,我无法使其工作。'dog'
b
>>> 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) 与.index()
有O(n)
成本的列表查找。随着规模的扩大,a
您会注意到这一点。b
缺点是对重复值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']