0

たとえば、次の 2 つのリストがあります。

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

リストbの共通要素をリストaの順序で並べ替えて、次のようにしたいと思います。

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

を使用して同様の質問を読みましたが、リストに同じ要素が含まれていない場合 (つまり、 list 内)sorted()は機能しません。'dog'b

4

4 に答える 4

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()、最初のインデックスを選択するのではなく、最後のインデックスを選択します。

于 2013-05-30T16:55:13.323 に答える
0

(冷凍)セットを使用できます。私はこれを他の答えと比較していません。

>>> a = ['a','b','c','d','e']
>>> b = ['c','a','dog']
>>> list((frozenset(a)^frozenset(b))^frozenset(a))
['a', 'c', 'dog']
于 2013-05-30T21:33:02.637 に答える
0

1つのオプションは、使用することです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']
于 2013-05-30T21:47:33.880 に答える