2017-04-18 14 views
1

Pythonについて簡単に質問してください。2つのリストで同じ順序で共通の要素を見つけるPython

a = ['t', 'o', 'a', 'c'] 
b = ['c', 't', 'a', 'o'] 

、その後、二つのリストの間で、互いに対して同じ順序でもある共通の要素/文字を返す:のような2つのリストを取るために任意の単純神託の方法があった場合、私は思っていました。

# possible outputs for this list could be either: 
output: ['t', 'a'] 
output: ['t', 'o'] 

私は当初、二つのリストで始まり、まだこれを行うことにより、タクトの順序を維持しながら マッチング要素を抽出することができます。私の元aとbのリストを与える

c = ['z', 't', 'o', 'g', 'a', 'c', 'f'] 
d = ['e', 'q', 'c', 't', 'a', 'o', 'y'] 
a = [x for x in c if x in d] 
b = [x for x in d if x in c] 

を。しかし、私はこれをさらに減らすために遠く離れた場所を見つけることができませんでした。セットを使って試しましたが、要素の順序は保持されません。私は簡単な方法はおそらくちょうどブルートとn^2場所で別のリストを比較することを知っていますが、私はそれを避け、2つのリストでお互いに最大の一致を見つける解決策を見つけることを試みています。

+0

を試してみましたか?トポロジカルなソートを調べましたか? – Alex

+0

'a'は同じ順序の唯一の要素ですが、結果は一致しませんか? – Neil

+0

@nfnneil、 'a'は同じ位置/インデックスにあります。私はOPが要素の相対的な順序を求めていると思います( 'c'は 'a'の後に 'a'の後ですが、bの前にあります) –

答えて

2
>>> import itertools 
>>> a = ['t', 'o', 'a', 'c'] 
>>> b = ['c', 't', 'a', 'o'] 

>>> [i for i in itertools.combinations(a, 2) if i in itertools.combinations(b, 2)] 

[('t', 'o'), ('t', 'a')] 

編集:

すべて

>>> c = ['z', 't', 'o', 'x', 'a', 'c', 'f', 'g'] 
>>> d = ['e', 'q', 'c', 't', 'a', 'g', 'o', 'y'] 

>>> def f(l): 
... r = [] 
... for i in range(2, len(l)+1): 
... r += itertools.combinations(l, i) 
... return r 
>>> 
>>> [i for i in f(c) if i in f(d)] 

[('t', 'o'), ('t', 'a'), ('t', 'g'), ('a', 'g'), ('c', 'g'), ('t', 'a', 'g')] 

または取得するには:あなたは何を

>>> def f(l): 
...  return [j for i in range(2, len(l)+1) for j in list(itertools.combinations(l, i))] 
>>> 
>>> [i for i in f(c) if i in f(d)] 

[('t', 'o'), ('t', 'a'), ('t', 'g'), ('a', 'g'), ('c', 'g'), ('t', 'a', 'g')] 
+0

あなたは言葉でそのアイデアを説明することであなたの答えを改善することができます。 – timgeb

+0

私はこの解決策が大好きです!しかし、これで遊んだ後では、範囲のためにc = ['i'、 't']とd = ['m'、 'i'、 't']のようなリストが失敗することがわかります –

+0

@JackLiaiea申し訳ありません、 今すぐやってみて下さい – Fabiano

関連する問題