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}


相关问题:。我最初认为这是一个复制品,但事实并非如此,因为它询问的是参差不齐和不规则的列表。我选择这个答案是因为它简单易懂。非常感谢。