Выбор с делами - PullRequest
       25

Выбор с делами

3 голосов
/ 25 октября 2011

Пожалуйста, примите во внимание:

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

Мне нужно выбрать все подсписки так, чтобы значение i никогда не было одинаковым в каждом подсписке из 4

{{3,1},{4,1}, {5,1}, {6,1}} должны быть приняты, а {{1,1}, {1,2}, {2,3}, {6,1}} должны быть отклонены,Значение 1 для меня повторяется 2 раза.

Я знаю, что мог бы сделать это с делами, но не понимаю его синтаксиса и считаю, что справка по делам пуста по сравнению с ее потенциальными приложениями.

Ответы [ 3 ]

6 голосов
/ 25 октября 2011

Если ваши данные находятся в переменной data, это должно сделать следующее:

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

Это принимает значение "i" (т.е. первый элемент) и проверяет, что все 4 значения различны (т.е. если мы удаляем дубликаты, у нас все еще есть 4 из них)

3 голосов
/ 25 октября 2011

В этом ответе предполагается, что входные данные представляют собой список кортежей по четыре пары каждая, например:

$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 голосов
/ 25 октября 2011

WReach уже покрыто Cases хорошо, так что вот другой подход.

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

Это быстрее, чем большинство других методов, но все же не так быстро, как метод Cases фиксированной длины.

...