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