Замена запятых в списке стрелкой -> - PullRequest
5 голосов
/ 23 декабря 2010

Как заменить запятые на втором уровне списка стрелками для замены?

Например, это:

{{a, girl}, {b, girl}, {c, girl}, {e, girl}, {g, girl}}

На это:

{{a->girl}, {b->girl}, {c->girl}, {e->girl}, {g->girl}}

Replace не работает, потому что думает, что запятой там быть не должно.Помещение в кавычки не работает, а также StringReplace

То, что я думаю, должно быть:

Replace[list, "," -> "->", {2}]

Ответы [ 3 ]

9 голосов
/ 23 декабря 2010

Следующее дает желаемый результат:

lop = {{a, girl}, {b, girl}, {c, girl}, {e, girl}, {g, girl}} (* list o' pairs *)

{#1 -> #2}& @@@ lop

Для меня это самый естественный способ сделать это.Вот еще один способ избежать использования лямбда-функции:

List /@ Rule @@@ lop

Подробнее об этом способе использования @@@: В Mathematica, что означает @@@? 1009 *

Если вам не нравится @@@, вы можете сделать это:

{First@# -> Last@#}& /@ lop

И вот еще один способ, используя правило замены:

lop /. {x_,y_}->{x->y}

И что зачерт, вот наименее интуитивно понятный способ сделать это:

Transpose@{Thread[Rule@@Transpose[lop]]}

(Обратите внимание, что /. - сокращение для ReplaceAll, /@ - сокращение для Map, @@это сокращение для Apply, а f@x это просто еще один способ написать f[x].)

4 голосов
/ 23 декабря 2010
{{a, girl}, {b, girl}, {c, girl}, {e, girl}, {g, girl}}/.{x_, y_} -> {Rule[x,y]} 

Результат:

{{a -> girl}, {b -> girl}, {c -> girl}, {e -> girl}, {g -> girl}}  

Это объясняется в руководствах по шаблонам и правилам преобразования в справочной системе.

HTH!

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

Вы МОЖЕТЕ сделать это с помощью строк ... но это не правильный путь:

x = ToString[{{a, girl}, {b, girl}, {c, girl}, {e, girl}, {g, girl}}];
y = StringReplace[x, "{" ~~ d_ ~~ ", " ~~ Shortest[f__] ~~ "}" -> 
                     "{" ~~ d ~~ "->" ~~ f ~~ "}"];
z = ToExpression@y

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

List[] и Sequence[] - это две конструкции, которые вы должны понимать, чтобы начать работать с Mathematica.

Замена скобок или запятой в списке невозможна, поскольку List[] - это функция, а {..,..,..,..} - просто обозначение.

Попробуйте следующее, чтобы понять это:

 {{a,b},{c,d}} //FullForm  

и

{a, b} /. List -> Plus
1 голос
/ 23 декабря 2010

MapApply прекрасно работает здесь:

In[1]:= Rule @@@ {{a, girl}, {b, girl}, {c, girl}, {e, girl}, {g, girl}}

Out[1]= {a -> girl, b -> girl, c -> girl, e -> girl, g -> girl}
...