две операции со списком в mathematica - PullRequest
4 голосов
/ 09 марта 2011

У меня есть две операции со списком, к которым я хотел бы обратиться за помощью.То, как я их реализовал, не очень элегантно, поэтому я хочу поучиться у ваших экспертов.

1) Предположим, у меня есть два списка, один из которых похож на {{0,2,4},{1,3,2},{2,0,4}}, а другой - {{1,3,7},{2,4,6},{3,1,9}}.Я хочу либо по значению, либо по какому-то критерию отфильтровать первый список, а затем получить соответствующие элементы во втором.Например, исходя из значения, которое не равно нулю, я хочу получить {{3,7},{2,4,6},{3,9}}.Исходя из условия больше 2, я хочу получить {{7},{4},{9}}.

2) У меня есть список, такой как {{{1,2},{1,1}},{{1,3},{2,4}},{{1,2},{2,3}},{{1,4},{3,3}}}.Я хочу сформировать {{{1,2},{{1,1},{2,3}}},{{1,3},{{2,4}}},{{1,4},{{3,3}}}.То есть я хочу сгруппировать эти вторые списки, если первый элемент совпадает.Как я могу сделать это красивым способом?

Большое спасибо.

Ответы [ 2 ]

11 голосов
/ 09 марта 2011

Для первой части вы хотите Pick:

In[27]:= Pick[{{1,3,7},{2,4,6},{3,1,9}},{{0,2,4},{1,3,2},{2,0,4}},_?Positive]
Out[27]= {{3,7},{2,4,6},{3,9}}

In[28]:= Pick[{{1,3,7},{2,4,6},{3,1,9}},{{0,2,4},{1,3,2},{2,0,4}},_?(#>2&)]
Out[28]= {{7},{4},{9}}

Для второго вопроса GatherBy поможет вам в этом.:

In[29]:= x = GatherBy[{{{1, 2}, {1, 1}}, {{1, 3}, {2, 4}}, {{1, 2}, 
    {2, 3}}, {{1, 4}, {3, 3}}}, First]

Out[29]= {{{{1, 2}, {1, 1}}, {{1, 2}, {2, 3}}}, {{{1, 3}, 
    {2, 4}}}, {{{1, 4}, {3, 3}}}}

И затем вы можете применить правило, чтобы немного очистить вещи:

In[30]:= x /. l:{{a_, _}..} :> {a, Last /@ l}

Out[30]= {{{1, 2}, {{1, 1}, {2, 3}}}, {{1, 3}, {{2, 4}}},
    {{1, 4}, {{3, 3}}}}
3 голосов
/ 09 марта 2011

Как сказал Майкл, Pick - определенно путь к первому.

Для второй части я хотел бы предложить альтернативу, позволяющую сделать это в одной строке: SelectEquivalents.(Я знаю, скорее самореклама, но я часто использую эту функцию.) Чтобы получить результат, который вы ищете, просто введите

In[1] := SelectEquivalents[ <list>, First, Last, {#1,#2}& ]
Out[1]:= {{{1, 2}, {{1, 1}, {2, 3}}}, {{1, 3}, {{2, 4}}}, {{1, 4}, {{3, 3}}}}

Внутренне, SelectEquivalents использует Reap и Sow,поэтому First помечает каждый элемент в <list>, Last преобразует элемент в форму, которую мы хотим использовать, а {#1, #2}& возвращает список с элементами формы {Tag, {<items with that tag>}}.Преимущество состоит в том, что вы можете указать все за один шаг, получая то, что вам нужно, без последующих преобразований.

...