如何用替换箭头替换列表第二级的逗号?
例如,这个:
{{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}]
答案 0 :(得分:9)
以下给出了所需的结果:
lop = {{a, girl}, {b, girl}, {c, girl}, {e, girl}, {g, girl}} (* list o' pairs *)
{#1 -> #2}& @@@ lop
对我而言,这是最自然的方式。 这是另一种避免使用lambda函数的方法:
List /@ Rule @@@ lop
有关使用@@@
:In Mathematica, what does @@@ mean?
如果你不喜欢@@@
,你可以这样做:
{First@# -> Last@#}& /@ lop
这是另一种方式,使用替换规则:
lop /. {x_,y_}->{x->y}
而且,到底是什么,这是我能想到的最不直观的方式:
Transpose@{Thread[Rule@@Transpose[lop]]}
(请注意,/.
是ReplaceAll
的简写,/@
是Map
的简写,@@
是Apply
的简写,{ {1}}只是写f@x
的另一种方式。)
答案 1 :(得分:4)
{{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
答案 2 :(得分:1)
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}