Как удалить лишний {} в этом использовании DeleteCases - PullRequest
2 голосов
/ 29 декабря 2011

( Mathematica версия: 8.0.4)

Учитывая

lst = {{{{1, 2}, 3}, {{4, 5}, 6}}, {{{7, 8, 9, 10, 11}, 13}}};
lst2 = DeleteCases[lst, {x_, y_} /; y > 6, {2}]

дает

{{{{1, 2}, 3}, {{4, 5}, 6}}, {}}

Обратите внимание на дополнительный пустой {}в конце.

Я не смог найти способ удалить его в той же команде, используя DeleteCases (что, я думаю, правильная команда для этого), поэтому мне пришлось применить его снова к результату

lst2 = DeleteCases[lst2, {}]

{{{{1, 2}, 3}, {{4, 5}, 6}}}

вопрос: есть ли уловка, чтобы выполнить вышеупомянутое в одной команде, не получая пустого {} в результате?так что команда является самодостаточной для всех случаев?

updatet 1

ответ на предложение Лу ниже о добавлении дополнительного { }

Вот пример, где я получаю разные результаты:

lst={{{{1, 2}, 3}, {{4, 5}, 6}}, {{{7, 8, 9, 10, 11}, 13}}}

теперь, используя метод удаления пустых {} дополнительным приложением DeleteCases, мы получаем

lst2 = DeleteCases[lst, {x_, y_} /; y >= 6, {2}]
{{{{1, 2}, 3}}, {}}

lst2 = DeleteCases[lst2, {}]
{{{{1, 2}, 3}}}

теперь, используя метод экстра { }

lst2 = DeleteCases[lst, {{x_, y_}} /; y >= 6]
{{{{1, 2}, 3}, {{4, 5}, 6}}}

, что не то же самое, я должен получить только {{{{1, 2}, 3}}}

спасибо

Ответы [ 6 ]

6 голосов
/ 29 декабря 2011

Похоже, что не существует общего автоматического способа удаления пустых списков, которые появляются в результате DeleteCases или другой функции структурного преобразования, как части первоначальной структурной операции. Их удаление должно быть отдельной операцией. Этот вопрос:

эффективный способ-удаляемого пустых списки, из-списков

отвечает, как это сделать эффективно после факта

5 голосов
/ 30 декабря 2011

Я думаю, что ваше оригинальное решение является хорошим решением:

$lst = {{{{1, 2}, 3}, {{4, 5}, 6}}, {{{7, 8, 9, 10, 11}, 13}}};

DeleteCases[$lst, {x_, y_} /; y > 6, {2}] // DeleteCases[#, {}] &

Это ясно и кратко. Альтернатива будет такой:

DeleteCases[$lst, {x_, y_} /; y > 6, {2}] /. {} -> Sequence[]

Однако давайте продолжим и попытаемся найти способ выполнить работу одним вызовом DeleteCases. Мы могли бы добавить альтернативный шаблон, который соответствует элементам верхнего уровня, которые содержат только отклоненные подпары:

DeleteCases[
  $lst
, (a:{{_, _?NumericQ}..} /; And @@ Map[#[[2]] > 6 &, a, {1}]) |
  ({_, y_?NumericQ} /; y > 6)
, {1, 2}
]

Не удобно записывать пороговое значение (6) дважды. Мы можем избежать этого:

DeleteCases[
  $lst
, 6 /. n_ :>
    (a:{{_, _?NumericQ}..} /; And @@ Map[#[[2]] > n &, a, {1}]) |
    ({_, y_?NumericQ} /; y > n)
, {1, 2}
]

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

Module[{test}
, test[elems:{{_, _?NumericQ}..}] := And @@ test /@ elems
; test[{_List, y_?NumericQ}] := y > 6
; DeleteCases[$lst, e_?test, {1, 2}]
]

Хотя эти предложения соответствуют заявленному требованию вызывать DeleteCases только один раз, я считаю их неудовлетворительными Мое основное возражение заключается в том, что они не так удобочитаемы, как исходное решение.

2 голосов
/ 29 декабря 2011
lst2 = DeleteCases[DeleteCases[lst, {x_, y_} /; y > 6, {2}], {}] 
1 голос
/ 29 декабря 2011

Все остальные ответы очень хороши, и я не решаюсь дать этот ответ.

Следующее - просто для удовольствия, ничего более:

lst = {{{{1, 2}, 3}, {{4, 5}, 6}}, {{{7, 8, 9, 10, 11}, 13}}};

Использование Cases

Cases[lst, {x_, y_} /; ! y > 6, {2}]

Cases[lst, {x_, y_} /; ! y >= 6, {2}]

давая

{{{1, 2}, 3}, {{4, 5}, 6}}

{{{1, 2}, 3}}

1 голос
/ 29 декабря 2011
lst2 = DeleteCases[lst, {{x_, y_}} /; y > 6]

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

lst2 = DeleteCases[Flatten[lst,1], {x_, y_} /; y >= 6]

это приводит к {{{1, 2}, 3}}

0 голосов
/ 30 декабря 2011

Почему бы просто не использовать предложение OR в DeleteCases и получить удаление на основе шаблона ИЛИ {}

DeleteCases[lst, {x_, y_} /; y > 6 | {}, {2} ]

На моей машине, которая возвращает результат:

{{{{1, 2}, 3}, {{4, 5}, 6}}, {{{7, 8, 9, 10, 11}, 13}}}

... это то, что я думаю, вы хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...