请考虑:
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。我知道我可以通过案例来解决这个问题,但是不要理解它的语法,并且发现案例的帮助与其潜在的应用程序相比是空的。
答案 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
方法快。