Условный выбор вложенных списков в Mathematica - PullRequest
2 голосов
/ 07 сентября 2011

Учитывая:

list= {{{{21, 22}, 283}, {{26, 13}, 28}, {{32, 17}, 531}, {{31, 11}, 
187}, {{30, 9}, 154}, {{25, 12}, 377}, {{12, 16}, 
285}}, {{{20, 19}, 183}, {{11, 23}, 249}, {{18, 21}, 
174}, {{12, 21}, 513}, {{24, 23}, 233}, {{29, 20}, 
465}}, {{{18, 20}, 136}, {{13, 23}, 244}, {{19, 21}, 
228}, {{14, 16}, 453}, {{14, 22}, 201}, {{18, 22}, 
417}, {{10, 22}, 217}, {{17, 23}, 180}}, {{{22, 20}, 
123}, {{25, 17}, 210}, {{28, 10}, 536}, {{27, 13}, 
296}, {{19, 11}, 391}, {{23, 18}, 305}, {{24, 18}, 204}}}


Length /@ list

{7, 6, 8, 7}

Вопрос:

Как я могу выбрать подсписок длиной> 7, например. Я безуспешно пробовал Позицию / Выбор: - (

Ответы [ 3 ]

7 голосов
/ 07 сентября 2011
Select[list, Length@# > 7 &]  

Редактировать

Если вы сомневаетесь, вы можете проверить, как критерий оценивает свои аргументы. Например:

Select[{a, b, c}, Print]

Или немного больше о классическом пути:

Reap@Select[{a, b, c}, Sow]

Спасибо Бретту за его предложение в комментариях ниже

4 голосов
/ 07 сентября 2011

Просматривайте все уровни, используя Случаи, с шаблоном, который соответствует только спискам длиной больше 7.

In[426]:= Cases[list, aa_List /; Length[aa] > 7, Infinity]

Out[426]= {{{{18, 20}, 136}, {{13, 23}, 244}, {{19, 21}, 
   228}, {{14, 16}, 453}, {{14, 22}, 201}, {{18, 22}, 417}, {{10, 22},
    217}, {{17, 23}, 180}}}

--- редактировать ---

Извините, я неправильно понял. Можно сделать, как указано выше, без этого третьего аргумента (Бесконечность). Результат в этом случае тот же.

--- конец редактирования ---

Даниэль Лихтблау

1 голос
/ 10 сентября 2011

Некоторые другие варианты:

Cases[list,_?(Length[#]>7&)]

If[Length[#]>7,#]&/@list/.Null->Sequence[]

(x\[Function]Replace[x,x_?(Length[#]<=7&)->Sequence[]])/@list
...