我在理解Mathematica中的尖锐符号时遇到了一些问题。我将# &
理解为变量的占位符。但是,在下面的代码中如何理解#1
和#2
呢?
x = {0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1};
Split[x, #1 =!= 0 && #2 =!= 0 &]
这里有什么#1
和#2
?这些行的输出为
{{0}, {1, 1, 1}, {0}, {0}, {1, 1, 1}, {0}, {0}, {1}}
该版本的 Split 的形式为Split[list,test]
,其中test
是一个接受两个变量的函数。所以
#1 =!= 0 && #2 =!= 0 &
是双变量纯函数的简写,其中#1
和#2
是变量名称。
通常,Split
将获取一个列表并返回分区为连续运行的"相同"元素的相同列表。因此,如果您的列表是list={0,0,2,2,3,4,4,5,5,5,7}
,那么Split[list]
产生
{{0,0}, {2,2}, {3}, {4,4}, {5,5,5}, {7}}
但也许你想定义两件事"相同"不同的含义。这就是通用Split[list,test]
功能的用武之地。这里的test
函数是一个函数,它接受两个参数,如果它们相同,则返回 true;test
函数是测试是否或两个事物是否相同。例如,您给出的测试函数
#1 =!= 0 && #2 =!= 0 &
如果两个元素都为非零,则返回 true。因此,您的Split
函数对元素进行分组,如果它们是零的运行,或者它们是非零的运行。
再举一个例子,假设你想说两个整数是相同的,如果它们具有相同的奇偶校验(偶数或奇数)。那么你的拆分函数将是
Split[list, Mod[#1,2] == Mod[#2,2]]
对于我定义的列表将返回
{{0,0,2,2}, {3}, {4,4}, {5,5,5,7}}