关于替换:用箭头替换列表中的逗号->

Replacing commas in list with arrow ->

如何用替换箭头替换列表第二级的逗号?

例如,这:

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

为此:

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

Replace不起作用,因为它认为逗号不应该存在。将其放在引号中无效,StringReplace

也无效

我认为应该是:

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

以下给出了预期的结果:

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

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

对我来说,这是最自然的方式。
这是避免使用lambda函数的另一种方法:

1
List /@ Rule @@@ lop

有关使用@@@的更多方法:在Mathematica中,@@@是什么意思?

如果您不喜欢@@@,则可以执行以下操作:

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

这是使用替换规则的另一种方式:

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

这到底是什么,这是我想到的最不直观的方法:

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

(请注意,/.ReplaceAll的简写,/@Map的简写,@@Apply的简写,而f@x只是编写f[x]的另一种方式。 )


1
{{a, girl}, {b, girl}, {c, girl}, {e, girl}, {g, girl}}/.{x_, y_} -> {Rule[x,y]}

结果:

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

这些内容在帮助系统中有关模式和转换规则的教程中进行了说明。

HTH!

编辑

您可以使用字符串...来做到这一点,但这不是正确的方法:

1
2
3
4
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[]是一个函数,而{..,..,..,..}只是一种表示法。

尝试以下操作以了解它:

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

1
{a, b} /. List -> Plus

MapApply在这里效果很好:

1
2
3
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}