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

2024-04-19 15:37:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

所有可能的宫缩。我想能够做到这一点的可变大小的列表(但总是其中2个)。我已经用Python的itertools玩了很多次了,但是我不知道它是如何使用两个列表的。任何帮助都将不胜感激。你知道吗


Tags: 代码元素列表bebdadacitertools
3条回答
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']

以下是我的版本:

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,收缩是在每个序列中like索引的元素之间。','.join(a+b for a,b in zip(s1,s2))对于这样的收缩来说是一个很好的字符串。你知道吗

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

相关问题 更多 >