Here is what I have done.


DeleteCases[{{x -> a}, {x -> b}, {x -> c, x -> d}}, Rule, {2}]


{{x -> a}, {x -> b}, {x -> c, x -> d}}

Why is it not {{x, a}, {x, b}, {{x, c}, {x, d}}}?

  • $\begingroup$ {{x -> a}, {x -> b}, {x -> c, x -> d}} /. (x_ -> a_) :> {x, a} /. {{a__}} :> {a} also works. $\endgroup$ – wuyudi Feb 16 at 13:58

DeleteCases does not by default operate on heads. You can set the Heads option to True to change that.

DeleteCases[{{x -> a}, {x -> b}, {x -> c, x -> d}}, Rule, {3}, Heads -> True]
{{x, a}, {x, b}, {x, c, x, d}}

Note that the last term has become {x, c, x, d} which is not quite what you expected, but it is logically consistent if we expect {x -> a} to become {x, a}.

A simpler path to the same output in this case is:

{{x -> a}, {x -> b}, {x -> c, x -> d}} /. Rule -> Sequence
{{x, a}, {x, b}, {x, c, x, d}}

Your expected output can be had from:

{{x -> a}, {x -> b}, {x -> c, x -> d}} /. Rule -> List /. {x_List} :> x
{{x, a}, {x, b}, {{x, c}, {x, d}}}

Recommended reading:

|improve this answer|||||
  • $\begingroup$ Is it possible to use Apply to 2nd levelspec? $\endgroup$ – kile Feb 17 at 9:51
  • 1
    $\begingroup$ @kile Yes! You could write Apply[Sequence, {{x -> a}, {x -> b}, {x -> c, x -> d}}, {2}] But understand that Sequence must evaluate, so this is not directly deleting the head. See the "Recommended reading" link for details. $\endgroup$ – Mr.Wizard Feb 17 at 11:55

Replacing heads is generically supported by Apply (@@ / @@@). So a functional way may look like this:

rules = {{x -> a}, {x -> b}, {x -> c, x -> d}};
If[Length[#] == 1, Flatten[#], Identity[#]] & /@ Apply[List, rules, {-2}]
{{x, a}, {x, b}, {{x, c}, {x, d}}}


If[Length[#] == 1, Sequence @@@ #, List @@@ #] & /@ rules

returns the same result.

|improve this answer|||||

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.