In[24]:= Complement[{a, b, c, d, e, f, g}, {a, b}, {e, f,
g}] (*这个函数相当于是求**{a,b}和{e,f,g}在全集{a,b,c,d,e,f,g}中的补集*)
Out[24]= {c, d}
另外还有一个函数用于删除列表中所有重复的元素,DeleteDuplicates[list],如下:
In[25]:= DeleteDuplicates[{a, b, c, a}]
Out[25]= {a, b, c}
【6. 列表的排序】
通常我们还需要对列表进行排序操作,具体见下面的一些例子,包括升序、降序、反序、轮序。
In[26]:= Sort[{b, a, c, a, b}] (*把列表元素整理成标准顺序,即升序,也即按照字母或者数字的先后或大小顺序排列*)
Out[26]= {a, a, b, b, c}
In[29]:= Sort[{4, 5, 2, 1, 8,
4},
#1 > #
2 &] (*把列表元素整理成降序排列,
#1>#
2&涉及到Mathematica中的纯函数,暂时就将之理解成一个排序的判断条件*)
Out[29]= {8, 5, 4, 4, 2, 1}
Mathematica中Sort函数的功能远不止我现在所罗列的,建议参考帮助文档。就想上一个列子所示,Sort[list,p]就表示按照排序函数p(即一个排序规则)对元素排列,充分利用好排序函数p,可以实现任意排序,比如按绝对值大小排序,对于字符串列表按字符串的长度排序等等。下面讲讲列表的反序排列。所谓反序,就是将原先列表的元素倒过来重新排列。这个看一个例子就知道了,函数也很简单,就是Reverse[list]: In[33]:= Reverse[{a, 5, c, x + y, e}] (*将列表{a,b,c,d,e}倒过来排列*)
Out[33]= {e, x + y, c, 5, a}
而所谓轮序,就是指将列表list元素向左或向右轮换n个位置,其函数是:RotateLeft[list,n](左轮序)和RotateRight[list,n](右轮序),见下面例子会很明晰:
In[34]:= RotateLeft[{a, 5, c, x + y, e}, 2] (*把列表中的元素向左轮换("移动")2个位置*)
Out[34]= {c, x + y, e, a, 5}
可以看到列表头部向左移出的元素依次添加到列表末尾,这就是向左轮序。向右轮序RotateRight[list,n]则是将列表尾部向右移出的元素依次添加到列表的头部,如下所示:
In[35]:= RotateRight[{a, 4, c, x + y, e}, 2]
Out[35]= {x + y, e, a, 4, c}
或者在RotateLeft[list,n]给出负移位(-n),也可以实现右轮序变换:
In[36]:= RotateLeft[{a, 4, c, x + y, e}, -2]
Out[36]= {x + y, e, a, 4, c}
另外再提两个函数,Ordering[list,n]和Permutaions[list]。
Ordering[list,n]表示给出列表前n个元素从小到大的位置,若是n缺省,则表示给出列表list中元素从小到大的位置,如下所示:
In[37]:= Ordering[{5, 3, 4, 2, 7}]
Out[37]= {4, 2, 3, 1, 5}
In[38]:= {5, 3, 4, 2, 7}[[%37]] (*这与Sort[{5,3,4,2,7}]产生相同的结果*)
Out[38]= {2, 3, 4, 5, 7}
Permutations[list]则表示给出list的所有可能排序,例子就不再给出了。
【7. 列表元素的分组和合并】
列表元素的分组和合并主要有以下三个函数:
Partition[list,n]表示将list分成n个元素一组,形成一个列表的列表
Partition[list,n,d]表示使用偏移d进行主次分组,但仍然是n个元素一组,形成一个列表的列表
Split[list]表示把list按邻接的相同元素进行分组
具体的使用见下面一个例子:
In[39]:= t = {a, b, c, d, e, f, g} (*建立一个列表,赋值给t*)
Out[39]= {a, b, c, d, e, f, g}
In[40]:= Partition[t, 2] (*把列表元素按对分组,此时去掉末尾余下的单个元素*)
Out[40]= {{a, b}, {c, d}, {e, f}}
In[41]:= Partition[t, 3, 1](*把列表分成3个三个元素一组,相邻的三个元素组之间仅差一个元素*)
Out[41]= {{a, b, c}, {b, c, d}, {c, d, e}, {d, e, f}, {e, f, g}}
In[42]:= Split[{a, a, b, b, b, a, a, a, b}](*把列表邻接的相同元素进行分组*)
Out[42]= {{a, a}, {b, b, b}, {a, a, a}, {b}}
【8. 嵌套列表的重排】
如果使用矩阵或者生成多维数组的表,将会碰到嵌套列表,有时就需要对这些嵌套列表进行操作,具体有以下几个函数:
Flatten[list] 表示将嵌套列表的元素重排成一维列表
Partition[list,{n1,n2,...}] 表示将嵌套列表分成大小n1*n2*...的块,不足构成n1*n2*...的元素被丢弃
具体见下面的例子:
In[43]:= Flatten[{{a}, {b, {c}}, {d}}]
Out[43]= {a, b, c, d}
In[50]:= Partition[{{a, b, c}, {d, e, f}, {1, 2, 3}, {4, 5, 6}}, {3, 2}]
Out[50]= {{{{a, b}, {d, e}, {1, 2}}}}
注意上述这个形式可能很难看出这究竟是怎么一回事。如果将其变换成矩阵的标准形式,那就很容易看出来Partition[list,{n1,n2,..}]是一个什么样的功能,
建议大家自己试试看,只要写成Partition[{{a,b,c},{d,e,f},{1,2,3},{4,5,6}},{3,2}]//MatrixForm形式就可以知道。
OK,这个列表专题暂时告一段落了。当然这也不可能包括列表所有的内容,只是给大家一个参考,一个大致的轮廓。下个专题我将讲讲Mathematica中的“规则与模式”,这也是Mathematica中其中一个核心内容。
2012年05月22日 10点05分
21