将Mathematica值列表转换为布尔列表

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)


Mr.*_*ard 8

我会用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)