Изменение порядка с использованием шаблонов в Mathematica - PullRequest
3 голосов
/ 11 декабря 2011

Попытка сделать это:

list={{{33, 105, 203, 295}, {34, 106, 204, 296}}, 
      {{21, 135, 201, 333}, {22,136, 202, 334}}}

Я хотел бы преобразовать подсписки так, чтобы первый:

{{33, 105, 203, 295}, {34, 106, 204, 296}}

становится

{{33, 204, 106, 295}, {34, 106, 105, 296}}

Я не понимаю, что я делаю неправильно в следующем:

list /. {{a_,b_,c_,d_}, {e_,f_,g_,h_}} :> 
        {{a_,g_,f_,d_}, {e_,c_,b_,h_}}

EDIT

Благодаря комментарию Леонида, теперь работает ниже

 list /. {{a_,b_,c_,d_}, {e_,f_,g_,h_}} :> 
         {{a,g,f,d}, {e,c,b,h}}

Если кто-то знает лучший способ сделать это, не стесняйтесь.

1 Ответ

6 голосов
/ 11 декабря 2011

Как писал Леонид, но отказался публиковать ответ, ваш шаблон работает, как только он исправлен:

list /. {{a_,b_,c_,d_}, {e_,f_,g_,h_}} :> {{a, g, f, d}, {e, c, b, h}}

Это самый прямой способ решения этой задачи, но, как писал и Леонид, он не самый общий. Вот еще один способ, по общему признанию без шаблонов, что вы можете подойти к этому:

orderBy[list_, order_] := Partition[Flatten[#][[order]], 4] & /@ list

orderBy[list, {1, 7, 6, 4, 5, 3, 2, 8}]

Это позволяет вам указать переупорядочение как простую перестановку, легко написанную от руки или созданную с помощью RandomeSample@Range@8.

Если ваши данные имеют более разнообразную форму, их можно расширить с помощью других Partition параметров и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...