我刚刚对列表和功能操作提出了一些问题。
1)如果我有一个函数f[]
和一个列表list
,我想按顺序将f[]
应用于列表的每个元素,就像Scan
一样,但不是Map
,Apply
,甚至是Nest
。怎么做?
2)如果我有一个列表list
和一个索引列表ind
,如何在给定另一个值列表的情况下为相应的元素赋值? Map[list[[#]] &, ind] = value_list
会出现Set::write: Tag Map in ... is Protected
错误。
3)如何应用函数f[]
n
次并形成结果列表,而不是像函数n
那样组合函数Nest
次?是Map[f[],Range[n]]
吗?
修改
在回应评论时,这里有一些简单的例子,涉及如何在列表中将指定索引的元素设置为零。这些例子用于说明目的。当然,必须有更好的选择来完成这些任务。在进入像setZeroWithIndex[list_, ind_] := Module[{}, list[[ind]] = ConstantArray[0, Length[ind]];
Return[list]];
1)setZeroWithIndex[list_, ind_] := Scan[ReplacePart[list, # -> 0] &, ind];
。这不起作用。用Scan
,Map
等替换Apply
也不起作用。
2)setZeroWithIndex[list_, ind_] := Map[list[[#]] &, ind] = ConstantArray[0, Length[ind]];
mylist = Range[20]; setZeroWithIndex[mylist, {2, 4, 6}]
。得到了我发布的错误。
3)setZeroWithRandomIndex[list_] := ReplacePart[list, RandomInteger[{1,Length[list]}] -> 0]
。现在我只想应用setZeroWithRandomIndex
n
次,而不是多次功能性地组合它。 NestList
似乎无法在这里发挥作用。
答案 0 :(得分:4)
Scan
或Do
会做到这一点。试试Scan[f, list]
或Do[f@el, {el, list}]
。
关于2),您应该使用Part
。例如,list[[{ind}]] = a
将根据需要更改元素。如果a
是与ind
长度相同的向量,则会发生相应的线程。
3)你应该看看NestList
。