Mar*_*zek 6 boolean wolfram-mathematica list
首先,抱歉这个混乱的标题.
我想要做的是转换{1, 4, 9}
为:
{True, False, False, True, False, False, False, False, True}
Run Code Online (Sandbox Code Playgroud)
也就是说,只有第一个列表中的索引才有值True
,其余的将是False
.
我觉得有一些非常简单的解决方案,但我对Mathematica和函数式编程都很陌生.我可以在一个循环中迭代地完成它,但必须有一些与整个列表一起工作的东西.对?:)
谢谢你的帮助.
编辑:在我问之前表明我尝试做某事,这是我目前的进展:
first={1,4,9}
ReplacePart[Table[False, {x, Max[first]}], {1} -> True]
(* gives {True, False, False, False, False, False, False, False, False} *)
Run Code Online (Sandbox Code Playgroud)
不幸的是,它无法使用{1,4,9} -> True
,但可以使用{1 -> True, 4 -> True, 9 -> True}
.但我不知道怎么做到......
编辑2:得到它.
ReplacePart[Table[False, {x, Max[first]}], Table[x -> True, {x, first}]]
Run Code Online (Sandbox Code Playgroud)
我仍然希望看到你的解决方案!这对我来说似乎是一个丑陋的黑客...... :)
abc*_*bcd 13
这是一个简单的方法:
first = {1, 4, 9};
list = ConstantArray[False, Max@first];
list[[first]] = True;
list
Out[1]= {True, False, False, True, False, False, False, False, True}
Run Code Online (Sandbox Code Playgroud)
以上是作为方便功能编写的上述解决方案:
Clear[convertIndices]
convertIndices[index_List] :=
Module[{list = ConstantArray[False, Max@index]},
list[[index]] = True; list]
Run Code Online (Sandbox Code Playgroud)
用法:
convertIndices@{1, 4, 9}
Out[2]= {True, False, False, True, False, False, False, False, True}
Run Code Online (Sandbox Code Playgroud)
我会用SparseArray
这个操作.在我看来,它很容易理解,并且它也很有效,特别是当低百分比的指数为True时.
true = {1, 4, 9};
SparseArray[(List /@ true) -> True, Automatic, False]
Run Code Online (Sandbox Code Playgroud)
或者用Transpose
(当粘贴到Mathematica时看起来更好):
SparseArray[{true}\[Transpose] -> True, Automatic, False]
Run Code Online (Sandbox Code Playgroud)
Normal
如果必须将输出转换为普通数组,则可以使用,但大多数操作都不需要.
另外,牺牲简洁性的实用性:
#==1 & /@ SparseArray[List /@ true -> 1]
Run Code Online (Sandbox Code Playgroud)