Wolfram mathematica 对Mathematica中列表中每个元素的第二个组件执行操作
我可以使用以下方法对列表中每个元素的第一个组件执行一些操作(在本例中为Wolfram mathematica 对Mathematica中列表中每个元素的第二个组件执行操作,wolfram-mathematica,Wolfram Mathematica,我可以使用以下方法对列表中每个元素的第一个组件执行一些操作(在本例中为ToString): {ToString@#[[1]], Rest@#}~Flatten~1 & /@ {{1, 2}, {3, 4, 5}} 不过,我有几个问题: 它不适用于{ToString@#[[1]],Rest@#}~Flatten~1&/{1, 2} ,2,{3,4,5}}原因很明显。如何使它也适用于 这个案子?预期的输出将是{{“1”,2},2,{“3”,4,5} 如何轻松地为第二个(或第三个等)组件执
ToString
):
{ToString@#[[1]], Rest@#}~Flatten~1 & /@ {{1, 2}, {3, 4, 5}}
不过,我有几个问题:
- 它不适用于
原因很明显。如何使它也适用于 这个案子?预期的输出将是{ToString@#[[1]],Rest@#}~Flatten~1&/{1, 2} ,2,{3,4,5}}
{{“1”,2},2,{“3”,4,5}
- 如何轻松地为第二个(或第三个等)组件执行此操作?也就是说,我希望输出是
{{0},{1,2},{3,4,5},{6,7,9,10}
- 有没有一种方法可以使用模式/规则(比如
)用于这种操作?因此,请列出您可能想到的所有解决方案,无论其效率如何/.{#[[1]]->ToString[#[[1]]]}
非常感谢 以下函数基本上可以满足您的需要:
ClearAll[applyToAll];
applyToAll[f_, list_List, n_Integer] :=
applyToAll[x_ :> f[x], list, n];
applyToAll[rule : (_Rule | _RuleDelayed), list_List, n_Integer] :=
Replace[
list, {left : Repeated[_, {n - 1}], el_, rest___} :>
{left, el /. rule, rest}, {1}];
并且可以接受规则。例如:
In[192]:=
applyToAll[ToString, {{1,2},2,{3,4,5}},1]//InputForm
Out[192]//InputForm= {{"1", 2}, 2, {"3", 4, 5}}
In[193]:= applyToAll[ToString,{{0},{1,2},{3,4,5},{6,7,9,10}},2]//InputForm
Out[193]//InputForm= {{0}, {1, "2"}, {3, "4", 5}, {6, "7", 9, 10}}
In[194]:= applyToAll[x_?OddQ:>ToString[x],{{0},{1,2},{3,4,5},{6,7,9,10}},2]//InputForm
Out[194]//InputForm= {{0}, {1, 2}, {3, 4, 5}, {6, "7", 9, 10}}
直到我写完它,我才意识到这和Leonid的核心函数是一样的。不过,也许这意味着,这可能比他相当复杂的职能更加透明
lst = {{1, 2}, 2, {3, 4, 5}};
Replace[lst, {a_, b__} :> {ToString@a, b}, 1]
{{"1", 2}, 2, {"3", 4, 5}}
然后可以使用
{x:Repeated[u,{4}],a_u,b_u}:>{x,ToString@a,b},1]
对于第五个索引,等等。从长远来看,我认为这可能是一个更容易的方法,即使它不是您所要求的:
rep[f_, pos_][x_List] := MapAt[f, x, pos]
rep[__][x_] := x
lst = {{1, 2}, 2, {3, 4, 5}};
rep[ToString, 2] /@ lst
{{1, "2"}, 2, {3, "4", 5}}
您可以根据需要将任意模式和条件添加到
rep
的定义中。另一种方便的方法可能是将ReplacePart
与RuleDelayed
例如,要将每个子列表(如果存在)的第3部分转换为字符串:
ReplacePart[#, 3 :> ToString@#[[3]]] & /@ {{1, 2},
2, {3, 4, 5}, {6, 7, 9, 10}} // InputForm
ReplacePart[#, 1 :> ToString@#[[1]]] & /@ {{1, 2},
2, {3, 4, 5}} // InputForm
作为输出提供:
{{1,2},2,{3,4,5},{6,7,9,10}
类似地,要将每个子列表的第1部分转换为字符串:
ReplacePart[#, 3 :> ToString@#[[3]]] & /@ {{1, 2},
2, {3, 4, 5}, {6, 7, 9, 10}} // InputForm
ReplacePart[#, 1 :> ToString@#[[1]]] & /@ {{1, 2},
2, {3, 4, 5}} // InputForm
给予:
{{“1”,2},2,{“3”,4,5}
相关问题:。我最初认为这是一个复制品,但事实并非如此,因为它询问的是参差不齐和不规则的列表。我选择这个答案是因为它简单易懂。非常感谢。