2013-05-30 141 views
0

我有2所列出,例如:排序与另一顺序Python列表,大列表

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

我想通过列表的顺序在列表B中的常见元素进行排序,得到类似这样的:

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

我一直在使用sorted()阅读类似的问题,但我不能挣钱的时候,名单不包含相同的元素它的工作(即'dog'列表b)。

+0

你就不能过滤列表'了'使用'B',然后排序呢? – GWW

+0

您能否提供一个例子,其中排序列表不是按照字典顺序排序的?因为'a'只是在自然排序时扮演什么角色并不是很明显。 – poke

+0

当“狗”不在列表中时,您不希望它具有何种行为。 –

回答

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()挑选第一个索引。

+0

这个缺点并不是真正的很大的一个,因为列表可以被处理一次(没有大的动摇,因为一个人正在保存查找)通过使用'dict((v,i)for i,v in enumerate(OrderedDict.fromkeys( a)))''而不是... –

+0

我在考虑使用'reversed()'实际上可以在这里解决'问题'。 :-)但是'OrderedDict'在这种情况下可能会更快,因为反转'enumerate()'需要在内存中实现枚举。 –

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

您可以使用(冻结)集。我没有把这个与其他答案对准。

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

Python集合是无序集合。这在我测试的时候有效,但是这个解决方案会一直工作吗? – iruvar

+0

好点。编辑。 – verbsintransit

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