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