从两个不同的列表中收缩元素

时间:2014-10-31 04:28:59

标签: python matlab wolfram-mathematica

我有两个不同的列表list1 = ['A','B']list2 = ['C','D','E']。我希望能够找到两个列表元素之间所有可能的收缩。对于目前的情况,我想有一个代码(最好是Python,Mathematica或MATLAB),它采用上面的列表并返回:

AC,BDAC,BEAD,BCAD,BEAE,BCAE,BD

这些都是可能的收缩。我希望能够为可变大小的列表(但总是其中2个)执行此操作。我使用Python的itertools玩过很多次但是我无法理解它如何使用两个列表。任何帮助将非常感激。

4 个答案:

答案 0 :(得分:1)

这是我的版本:

import itertools

l1 = 'AB'
l2 = 'CDE'

n = min(len(l1),len(l2))
print('; '.join(
    ','.join(a+b for a,b in zip(s1,s2))
    for s1,s2 in itertools.product(
        itertools.permutations(l1,n),
        itertools.combinations(l2,n),
    )
))

这将输出:

AC,BD; AC,BE; AD,BE; BC,AD; BC,AE; BD,AE

请注意,为简洁起见,我没有构建项目列表,而是直接迭代字符串。两个列表中的哪一个获得permutations以及哪个获得combinations无关紧要,这只会改变输出的顺序。 permutations采用所有可能的排序,而combinations返回排序的排序。这样,您只需获得一次收缩。

对于每次收缩,您将获得两个序列s1s2,收缩在每个序列中相似索引的元素之间。 ','.join(a+b for a,b in zip(s1,s2))为这种收缩做了一个很好的字符串。

答案 1 :(得分:1)

listA = {"A", "B"};
listB = {"C", "D", "E"};
f[x_, y_] := If[StringMatchQ[StringTake[x, {2}], StringTake[y, {2}]], 
                    Sequence @@ {}, List[x, y]];
z = Outer[StringJoin, listA, listB];
Flatten[Outer[f, First@z, Last@z], 1]

Mathematica graphics

答案 2 :(得分:0)

如果你问的是如何构建两个列表中包含的项目的所有排列,没有重复,每个结果长度为2,你可以使用itertools.permutation:

combined_list = []
for i in list1 + list2:
    if i not in combined_list:
        combined_list.append(i)

for perm in itertools.permutations(combined_list, 2):
    print(perm)

对于输入list1 = ['a','b']和list2 = ['c','d','e'],输出:

('a', 'b') ('a', 'c') ('a', 'd') ('a', 'e') ('b', 'a') ('b', 'c') ('b', 'd') ('b', 'e') ('c', 'a') ('c', 'b') ('c', 'd') ('c', 'e')  ('d', 'a') ('d', 'b') ('d', 'c') ('d', 'e') ('e', 'a') ('e', 'b') ('e', 'c') ('e', 'd')

答案 3 :(得分:0)

In [2]: list1 = ['A','B']

In [3]: list2 = ['C','D','E']

In [4]: list(itertools.product(list1, list2))
Out[4]: [('A', 'C'), ('A', 'D'), ('A', 'E'), ('B', 'C'), ('B', 'D'), ('B', 'E')]

In [5]: [''.join(p) for p in itertools.product(list1, list2)]
Out[5]: ['AC', 'AD', 'AE', 'BC', 'BD', 'BE']