如何在使用DeleteCases时删除额外的{}

Nas*_*ser 2 wolfram-mathematica

(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}]
Run Code Online (Sandbox Code Playgroud)

{{{{1, 2}, 3}, {{4, 5}, 6}}, {}}
Run Code Online (Sandbox Code Playgroud)

注意最后的额外空{}.

我找不到使用相同命令删除它的方法DeleteCases(我认为这是用于此的正确命令),所以我不得不在结果上再次应用它

lst2 = DeleteCases[lst2, {}]

{{{{1, 2}, 3}, {{4, 5}, 6}}}
Run Code Online (Sandbox Code Playgroud)

问题:在一个命令中是否有一个技巧可以{}在结果中没有得到空?所以这个命令是自包含的所有情况?

更新1

回应下面的Lou建议,增加一个额外的 { }

这是一个我得到不同结果的例子:

lst={{{{1, 2}, 3}, {{4, 5}, 6}}, {{{7, 8, 9, 10, 11}, 13}}}
Run Code Online (Sandbox Code Playgroud)

现在使用{}通过额外应用程序删除空的方法DeleteCases,我们得到

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

lst2 = DeleteCases[lst2, {}]
{{{{1, 2}, 3}}}
Run Code Online (Sandbox Code Playgroud)

现在使用额外的方法 { }

lst2 = DeleteCases[lst, {{x_, y_}} /; y >= 6]
{{{{1, 2}, 3}, {{4, 5}, 6}}}
Run Code Online (Sandbox Code Playgroud)

这是不一样的,我应该只得到 {{{{1, 2}, 3}}}

谢谢

Leo*_*rin 6

DeleteCases作为原始结构操作的一部分,似乎没有一般的自动方法来移除由于或其他结构转换函数而出现的空列表.他们的移除必须是一个单独的操作.这个问题:

高效的路去除的空 - 列出从 - 列表

回答如何在事后有效地做到这一点


WRe*_*ach 5

我认为您原来的解决方案是一个很好的解决方案:

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

DeleteCases[$lst, {x_, y_} /; y > 6, {2}] // DeleteCases[#, {}] &
Run Code Online (Sandbox Code Playgroud)

它清晰简洁.另一种选择是:

DeleteCases[$lst, {x_, y_} /; y > 6, {2}] /. {} -> Sequence[]
Run Code Online (Sandbox Code Playgroud)

但是,让我们坚持下去,并尝试通过一次调用找到一种方法来完成这项工作DeleteCases.我们可以添加一个替代模式,该模式匹配仅包含被拒绝的子对的顶级元素:

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

将阈值(6)写入两次是不方便的.我们可以避免:

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

或者,我们可以定义一个匹配顶级元素和单个子对的本地函数:

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

虽然这些提案符合规定的要求,DeleteCases只能援引一次,但我发现它们并不令人满意.我的主要反对意见是它们不像原始解决方案那样可读.