问题描述
|
我只是对列表和函数操作有几个问题。
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
次并形成结果列表,而不是像函数Nest
那样构成函数n
次?是15英镑吗?
编辑
为了回应评论,这里有一些简单的示例,所有示例都涉及如何将列表中具有指定索引的元素设置为零。应该以示例为例。当然,必须有更好的选择来完成这些任务。我只是累了这些,然后才来上班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
在这里似乎不起作用。
解决方法
Scan
或Do
会做到这一点。尝试Scan[f,list]
或Do[f@el,{el,list}]
。
关于2),您应使用Part
。例如,list[[{ind}]] = a
将根据需要更改元素。如果a
是与ind
相同长度的向量,则将发生适当的线程化。
3)您应该看NestList
。