Две операции со списком в mathematica

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

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 ответа

Решение

Для первой части, вы хотите 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}}}}

Как сказал Майкл, 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>}}, Преимущество состоит в том, что вы можете указать все за один шаг, получая то, что вы хотите, без последующих преобразований.

Другие вопросы по тегам