7

Considering we have a list of rules:

{ First-> {a-> "aaaa", b-> "bbbb"}, Second-> {c-> "cccc", d-> "dddd", e-> Missing["NotAvailable"], f-> Missing["NotAvailable"] }}

How can I bring this to be:

{ First-> {a-> "aaaa", b-> "bbbb"}, Second-> {c-> "cccc", d-> "dddd" }}

Thanks.

SuTron
  • 1,708
  • 1
  • 11
  • 21

4 Answers4

12
list =
 {First -> {a -> "aaaa", b -> "bbbb"}, Second -> {c -> "cccc", d -> "dddd"e -> Missing["NotAvailable"], f -> Missing["NotAvailable"]}}

DeleteCases[list, Rule[_, _Missing], Infinity]

{First -> {a -> "aaaa", b -> "bbbb"}, Second -> {c -> "cccc", d -> "dddd"}}

eldo
  • 67,911
  • 5
  • 60
  • 168
6

you can use DeleteMissing also

l = {First -> {a -> "aaaa", b -> "bbbb"}, 
  Second -> {c -> "cccc", d -> "dddd", e -> Missing["NotAvailable"], 
    f -> Missing["NotAvailable"]}};

Normal@DeleteMissing[Association@l, Infinity]
(*{First -> {a -> "aaaa", b -> "bbbb"},Second -> {c -> "cccc", d -> "dddd"}}*)
Basheer Algohi
  • 19,917
  • 1
  • 31
  • 78
4

Here is another alternative using UpValues:

Block[{Missing},
 Missing /: _ -> Missing["NotAvailable"] := Sequence[];
 {First -> {a -> "aaaa", b -> "bbbb"}, 
  Second -> {c -> "cccc", d -> "dddd", e -> Missing["NotAvailable"], 
    f -> Missing["NotAvailable"]}}
 ]
(*
  {First -> {a -> "aaaa", b -> "bbbb"}, Second -> {c -> "cccc", d -> "dddd"}}
*)
rcollyer
  • 33,976
  • 7
  • 92
  • 191
3

Less elegant than DeleteCases, however an alternative:

exp = {First -> {a -> "aaaa", b -> "bbbb"}, 
  Second -> {c -> "cccc", d -> "dddd", e -> Missing["NotAvailable"], 
    f -> Missing["NotAvailable"]}}

 Delete[exp, Position[exp, _ -> _Missing]] 

Or

 Delete[exp, Drop[#, -1] & /@ Position[exp, _Missing]]

(*{First -> {a -> "aaaa", b -> "bbbb"}, Second -> {c -> "cccc", d -> "dddd"}}*)
penguin77
  • 1,645
  • 9
  • 8