选择案例

时间:2011-10-25 17:03:15

标签: select wolfram-mathematica design-patterns case

请考虑:

Subsets[Flatten[ParallelTable[{i, j}, {i, 1, 96}, {j, 1, 4}], 1], {4}]

我需要选择所有子列表,使得每个子列表中的i值永远不会相同

{{1,1},{1,2},{2,3}应接受{{3,1},{4,1},{5,1},{6,1}} ,{6,1}}应该被拒绝。我被重复2次的价值1。

我知道我可以通过案例来解决这个问题,但是不要理解它的语法,并且发现案例的帮助与其潜在的应用程序相比是空的。

3 个答案:

答案 0 :(得分:6)

假设您的数据位于变量data中,则应执行以下操作:

Select[data, Length@Union[#[[All, 1]]] === 4 &]

这取“i” - 值(即第一个元素),并检查4个值是否都不同(即如果我们删除重复项,我们仍然有4个)

答案 1 :(得分:3)

此响应假定输入数据是每对四对元组的列表,例如:

$data = {{{3, 1}, {4, 1}, {5, 1}, {6, 1}} , {{1, 1}, {1, 2}, {2, 3}, {6, 1}}};

使用Cases,可以命名并比较每对中的第一个元素,以确保它们不相等:

Cases[
  $data
, {{a_, _}, {b_, _}, {c_, _}, {d_, _}} /; Unequal[a, b, c, d]
]

Cases的另一种用法是比较每对中的第一个元素而不命名它们:

Cases[
  $data
, tuple_ /; Unequal @@ tuple[[All, 1]]
]

或者,可以使用DeleteCases并排除至少两对具有相同初始值的元组:

DeleteCases[
  $data
, {___, {a_, _}, ___, {a_, _}, ___}
]

有人可能认为这最后一个表达可能是:

(* warning: does not work *)
Cases[$data, Except[{___, {a_, _}, ___, {a_, _}, ___}]]

...但是Except不允许在第一个参数中使用命名模式。

答案 2 :(得分:2)

WReach已经很好地涵盖了Cases,所以这是另一种方法。

Pick[data, Signature /@ data[[All, All, 1]], 1 | -1]

它比大多数其他方法快,但仍然没有固定长度Cases方法快。