我有两个不同的列表list1 = ['A','B']
和list2 = ['C','D','E']
。我希望能够找到两个列表元素之间所有可能的收缩。对于目前的情况,我想有一个代码(最好是Python,Mathematica或MATLAB),它采用上面的列表并返回:
AC,BD
,AC,BE
,AD,BC
,AD,BE
,AE,BC
,AE,BD
这些都是可能的收缩。我希望能够为可变大小的列表(但总是其中2个)执行此操作。我使用Python的itertools玩过很多次但是我无法理解它如何使用两个列表。任何帮助将非常感激。
答案 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
返回排序的排序。这样,您只需获得一次收缩。
对于每次收缩,您将获得两个序列s1
和s2
,收缩在每个序列中相似索引的元素之间。 ','.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]
答案 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']