我有2所列出,例如:排序与另一顺序Python列表,大列表
a = ['a','b','c','d','e']
b = ['c','a','dog']
我想通过列表的顺序在列表B中的常见元素进行排序,得到类似这样的:
['a','c','dog']
我一直在使用sorted()
阅读类似的问题,但我不能挣钱的时候,名单不包含相同的元素它的工作(即'dog'
列表b
)。
我有2所列出,例如:排序与另一顺序Python列表,大列表
a = ['a','b','c','d','e']
b = ['c','a','dog']
我想通过列表的顺序在列表B中的常见元素进行排序,得到类似这样的:
['a','c','dog']
我一直在使用sorted()
阅读类似的问题,但我不能挣钱的时候,名单不包含相同的元素它的工作(即'dog'
列表b
)。
我会转成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()
挑选第一个索引。
这个缺点并不是真正的很大的一个,因为列表可以被处理一次(没有大的动摇,因为一个人正在保存查找)通过使用'dict((v,i)for i,v in enumerate(OrderedDict.fromkeys( a)))''而不是... –
我在考虑使用'reversed()'实际上可以在这里解决'问题'。 :-)但是'OrderedDict'在这种情况下可能会更快,因为反转'enumerate()'需要在内存中实现枚举。 –
>>> 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','b','c','d','e']
>>> b = ['c','a','dog']
>>> list((frozenset(a)^frozenset(b))^frozenset(a))
['a', 'c', 'dog']
Python集合是无序集合。这在我测试的时候有效,但是这个解决方案会一直工作吗? – iruvar
好点。编辑。 – verbsintransit
一种选择是使用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']
你就不能过滤列表'了'使用'B',然后排序呢? – GWW
您能否提供一个例子,其中排序列表不是按照字典顺序排序的?因为'a'只是在自然排序时扮演什么角色并不是很明显。 – poke
当“狗”不在列表中时,您不希望它具有何种行为。 –