Соответствие шаблону элемента списка в Mathematica - PullRequest
2 голосов
/ 22 января 2011

Следующий шаблон соответствует только первому элементу

{a, b, c, d, e} /. {start : ___, x_, stop : ___} :> {start, 1, stop}

Как мне сделать так, чтобы он соответствовал всем элементам списка?

UPDATE:

Немного более расширенная версия моей цели - иметь набор из трех правил преобразования для различных элементов списка. Одно правило должно применяться к первому элементу, одно для последнего элемента и другое правило для каждого элемента в середине. Вот пример:

{a, b, c, d, e} /. {most : Repeated[_], x_} -> 
   {most, "Last"} /. {x_, rest : Repeated[_]} -> {"First", rest}

Это правила для первого и последнего элемента. Теперь мне нужно правило для всех элементов в середине. Отсюда мой оригинальный вопрос.

Возможно, я выбрал неправильный подход, потому что не могу найти простой способ сделать это. Возможно ли это сделать с помощью правил?

Ответы [ 2 ]

4 голосов
/ 22 января 2011

Ваш вопрос немного неясен.Просто угадать, что вы имели в виду - это приведет к самому длинному совпадению:

In[2]:= {a, b, c, d,  e} /. {start : Longest[___], x_, stop : ___} :> {start, 1, stop}

Out[2]= {a, b, c, d, 1}

Хотя это даст все возможные результаты применения правила, а не только первое совпадение:

In[3]:= ReplaceList[{a, b, c, d, e}, {start : ___, x_, stop : ___} :> {start, 1, stop}]

Out[3]= {{1, b, c, d, e}, {a, 1, c, d, e}, {a, b, 1, d, e}, {a, b, c, 1, e}, {a, b, c, d, 1}}

HTH

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

Отвечая на более изощренную версию вопроса, можно получить общий ответ:

{a, b, c, d, e} /. {start_, x__, end_} :> {f[start], g[x], h[end]},

Где, указав функции f,g,h, можно сделатьлюбые виды преобразований отдельно по первому, последнему и среднему элементам.Иногда вы можете использовать правила внутри правил, чтобы сделать его более кратким, например:

In[7]:= {a, b, c, d, e} /. {start_, x__, end_} :> {start /. _ -> "First", 
                   Sequence @@ Replace[{x}, _ -> 1, 1], end /. _ -> "Last"}

Out[7]= {"First", 1, 1, 1, "Last"}

Но главное в том, что после того, как вы деструктурировали список, не имеет значения, что вы используете для преобразования различных частей.- правила снова или функции и т. д. - вы не ограничены использованием только правил в этот момент.

2 голосов
/ 22 января 2011

Вы можете сделать:

list = Range[10]
list /. {first_, middle__, last_} -> {f[first], g[middle], h[last]}  

Out

{f[1], g[2, 3, 4, 5, 6, 7, 8, 9], h[10]}  

Или, если вы определите:

g[x_, y__] = {g[x], g[y]} /. List -> Sequence 

Тогда результат будет

{f[1], g[2], g[3], g[4], g[5], g[6], g[7], g[8], g[9], h[10]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...