2

我在理解 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}}
4

1 回答 1

3

该版本的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}}
于 2017-03-31T22:19:03.133 回答