Group Abstract Group Abstract

Message Boards Message Boards

0
|
9.1K Views
|
5 Replies
|
0 Total Likes
View groups...
Share
Share this post:

Select cases from a list based on two conditions?

5 Replies

With

In[1]:= Clear[data]
data = {{{1}, {2}, {1, 2, 3}}, {{1}, {3}, {1, 2, 3}}, {{1}, {1, 
    2}, {1, 2, 3}}, {{1}, {2, 3}, {1, 2, 3}}, {{2}, {3}, {1, 2, 
    3}}, {{2}, {1, 2}, {1, 2, 3}}, {{2}, {2, 3}, {1, 2, 3}}, {{3}, {1,
     2}, {1, 2, 3}}, {{3}, {2, 3}, {1, 2, 3}}, {{1, 2}, {2, 3}, {1, 2,
     3}}};

one implements the conditions straightforward

(* it is actually a conditional condition *)
Clear[wierzC1, wierzC]
wierzC1[l_List] := True /; Length[l] == 1
wierzC1[l_List] := (Length[l] - 
     Length[Select[
       Partition[l, 2, 
        1], ((#[[1, 1]] == #[[2, 1]]) || (#[[1, -1]] == #[[
             2, -1]])) &]] == 1) /; Length[l] > 1
(* preconditions:
p[i]: list of lists without sublists 
p[ii]: no empty sublists
p[iii]: length of the sublists in list is monoton
 *)
wierzC[l_List] := Block[{l0 = Length /@ l, sub1 = {}},
   If[Length[Cases[l0, 1]] > 1, (* condition 2 *)
    sub1 = Select[l, (Length[#] == 1) &];
    If[ContainsAny[
      Abs[Dot[{-1, 1}, #]] & /@ 
       First[Flatten[Tuples[sub1, {2}], {3}]], {1}],
     False, (* else: condition 1 for the rest *)
     wierzC1[Complement[l, sub1]]
     ], (* else: condition 1 *)
    wierzC1[l]
    ]
   ] /; (And @@ (VectorQ /@ 
       l)) && (And @@ (NonNegative /@ (Dot[{-1, 1}, #] & /@ 
         Partition[Length /@ l, 2, 1]))) && !ContainsAny[l, {{}}]

to reach the result

In[8]:= Select[data, wierzC]
Out[8]= {{{1}, {3}, {1, 2, 3}}, {{1}, {1, 2}, {1, 2, 3}}, {{2}, 
          {1, 2}, {1, 2, 3}}, {{2}, {2, 3}, {1, 2, 3}}, {{3}, {2, 3}, {1, 2, 3}}}

even in a language with an overwhelming rich set of keywords it is more often than not the case that a single word is not enough to let it do what you want it to do.

POSTED BY: Dent de Lion

Welcome to Wolfram Community! Please make sure you know the rules: https://wolfr.am/READ-1ST

Please next time link your post to the duplicated one from MSE site.

POSTED BY: EDITORIAL BOARD
Posted 7 years ago

Crossposted here.

POSTED BY: Rohit Namjoshi
Posted 7 years ago

The description for Rule 2 states:

So for example, we would pick {{1},{3},{1,2,3}} but not {{1},{2},{1,2,3}}.

Wouldn't {{1},{2},{1,2,3}} be eliminated by Rule 1 since 2 is not the first or last element of {1} or {1, 2, 3}?

POSTED BY: Rohit Namjoshi

Thank you for your comment. Yes, you're correct. But then {{1},{3},{1,2,3}} would also be eliminated, by Rule 1, since 3 is not the first or last element of {1} and so this the example for why we need the Rule 2. Rule 1 has to hold for all consecutive elements in the the list.

Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard