2017-04-18 48 views
1

只是有一個關於python的快速問題。我想知道是否有任何簡單的Python的方式採取兩個列表,如:查找兩個列表中相同順序的常見元素Python

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

,然後返回常見元素/字符,同時也是相互相同順序的兩個列表之間英寸

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

我最初開始與兩個列表,並提取匹配的元素 同時仍通過這樣維持秩序的機智:

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] 

哪位能給我原來的A和B名單。然而,我無法找到一個進一步減少這一點。嘗試使用集合,但不保留元素的順序。我知道一個簡單的方法可能只是爲了和n^2比較一個列表到另一個到位,但我試圖避免這一點,並找到一個解決方案,可以找到兩個列表中最大的匹配相對於彼此。

+0

你嘗試過什麼?你有沒有看過拓撲排序? – Alex

+0

'a'是同一順序中唯一的元素,不應該是結果嗎? – Neil

+0

@nfnneil,'a'處於相同的位置/索引,我想OP在詢問元素之間的相對順序('c'在'a'的'o'之後但在'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

我喜歡這個解決方案!然而,玩完這個之後,我發現for範圍會導致像c = ['i','t']和d = ['m','i','t']這樣的列表失敗 –

+0

@JackLiaiea對不起, 現在試試 – Fabiano

相關問題