两个列表之间的组合

时间:2013-12-21 16:36:38

标签: wolfram-mathematica combinations

我编辑了这篇文章。对不起,我以为它会出现在Mathematica部分。这个问题与mathematica软件有关。

我想在两个列表之间进行所有可能的组合,但有一些限制。例如,假设我有以下列表:

list1=Flatten[Table[{i, j}, {j, 0, 1}, {i, 0, 1}], 1]
{{0, 0}, {1, 0}, {0, 1}, {1, 1}}
list2={a,b}

我想得到的是一个列表,它在list1中的每个子列表和list2中的每个子列表之间进行所有可能的组合,如果可能的话,list2中的元素在list1中使用相同的子列表。我想要的解决方案是:

{{{0, 0, a}, {1, 0, b}}, {{0, 0, a}, {0, 1, b}}, {{0, 0, a}, {1, 1, b}}, {{1, 0, a}, {0, 0, b}}, {{1, 0, a}, {0, 1, b}}, {{1, 0, a}, {1, 1, b}}, {{0, 1, a}, {0, 0, b}}, {{0, 1, a}, {1, 0, b}}, {{0, 1, a}, {1, 1, b}}, {{1, 1, a}, {0, 0, b}}, {{1, 1, a}, {1, 0, b}}, {{1, 1, a}, {0, 1, b}}}

有一种简单的方法吗?

我想为更大的列表执行此操作,例如:

list1=Flatten[Table[{i, j, z}, {z, -2, 2}, {j, -2, 2}, {i, -2, 2}], 2]
  

{{ - 2,-2,-2},{-1,-2,-2},{0,-2,-2},{1,-2,-2},{2, - 2,-2},   {-2,-1,-2},{-1,-1,-2},{0,-1,-2},{1,-1,-2},{2,-1,-2 },   {-2,0,-2},{-1,0,-2},{0,0,-2},{1,0,-2},{2,0,-2},{-2 ,1,   -2},{-1,1,-2},{0,1,-2},{1,1,-2},{2,1,-2},{-2,2,-2} ,{-1,2,-2},{0,2,-2},{1,2,-2},{2,2,-2},{ - 2,-2,-1},{ -1,   -2,-1},{0,-2,-1},{1,-2,-1},{2,-2,-1},{ - 2,-1,-1},{ - 1,-1,-1},{0,-1,-1},{1,-1,-1},{2,-1,-1},{-2,0,-1},{ -1,0,-1},{0,0,-1},{1,0,-1},{2,0,-1},{ - 2,1,-1},{-1, 1,-1},{0,1,   -1},{1,1,-1},{2,1,-1},{ - 2,2,-1},{-1,2,-1},{0,2,-1} ,{1,2,-1},{2,2,-1},{ - 2,-2,0},{-1,-2,0},{0,-2,0},{1 ,-2,0},   {2,-2,0},{ - 2,-1,0},{-1,-1,0},{0,-1,0},{1,-1,0},{2, -1,   0},{ - -2,0,0},{-1,0,0},{0,0,0},{1,0,0},{2,0,0},{ - 2,1} ,   0},{-1,1,0},{0,1,0},{1,1,0},{2,1,0},{-2,2,0},{-1,2 ,   0},{0,2,0},{1,2,0},{2,2,0},{ - 2,-2,1},{-1,-2,1},{0, -2,   1},{1,-2,1},{2,-2,1},{ - 2,-1,1},{-1,-1,1},{0,-1,1}, {1,   -1,1},{2,-1,1},{ - -2,0,1},{-1,0,1},{0,0,1},{1,0,1},{ 2,0,1},{ - 2,1,1},{-1,1,1},{0,1,1},{1,1,1},{2,1,1},{ -2,   2,1},{-1,2,1},{0,2,1},{1,2,1},{2,2,1},{-2,-2,2},{ - 1,   -2,2},{0,-2,2},{1,-2,2},{2,-2,2},{ - 2,-1,2},{-1,-1, 2},{0,-1,2},{1,-1,2},{2,-1,2},{-2,0,2},{-1,0,2},{0 ,0,2},   {1,0,2},{2,0,2},{-2,1,2},{-1,1,2},{0,1,2},{1,1,2}, {2,   1,2},{ - 2,2,2},{ - 1,2,2},{0,2,2},{1,2,2},{2,2,2}}

list2={a,b,c,d}

以便解决方案如下:

{{{-2, -2, -2, a}, {-1, -2, -2, b}, {0, -2, -2, c}, {2, -2, -2, d}},....., {{-2, -2, -2, a}, {-1, -1, -1, b}, {0, 0, 0, c}, {2, 2, 2, d}}

请注意,以下内容不应在列表中

{{-2, -2, -2, a},{-2, -2, -2, b},{-2, -2, -2, c},{-2, -2, -2, d}}

非常感谢。

1 个答案:

答案 0 :(得分:2)

  • 我假设三胞胎对的具体顺序并不重要。

  • 使用Table缩短Tuples内容。

  • 您可以使用Subsets获取没有重复的对。

  • Permutations用于获取子集的所有排序。

  • JoinApply@@)用于展平嵌套列表的一个级别。

  • list2已使用List /@ {a, b}转换为{{a}, {b}},以便用于:

  • 最后一步是Map Function Join[#, list2, 2] &这些子集。

所有在一起:

list1 = Tuples[{0, 1}, 2]
list2 = List /@ {a, b};

Join[#, list2, 2] & /@ Join @@ Permutations /@ Subsets[list1, {2}]
{{{0, 0, a}, {0, 1, b}}, {{0, 1, a}, {0, 0, b}}, {{0, 0, a}, {1, 0, b}},
 {{1, 0, a}, {0, 0, b}}, {{0, 0, a}, {1, 1, b}}, {{1, 1, a}, {0, 0, b}},
 {{0, 1, a}, {1, 0, b}}, {{1, 0, a}, {0, 1, b}}, {{0, 1, a}, {1, 1, b}},
 {{1, 1, a}, {0, 1, b}}, {{1, 0, a}, {1, 1, b}}, {{1, 1, a}, {1, 0, b}}}