在两个列表中找到相同顺序的公共元素Python

时间:2017-04-18 16:22:33

标签: python list

有一个关于python的快速问题。我想知道是否有任何简单的pythonic方式来获取两个列表,如:

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比较一个列表到另一个列表,但我试图避免这种情况并找到一个解决方案,找到两个列表中相对于彼此的最大匹配。

1 个答案:

答案 0 :(得分: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')]