列表
列表
| 产生对象列表 | 添加、删除和修改列表元素 |
| 将一些对象放在一起 | 列表组合 |
| 值表的生成 | 作为集合的列表 |
| 处理列表中的元素 | 重排列表 |
| 向量和矩阵 | 列表元素的分组和合并 |
| 获得列表的部分元素 | 列表中的排序 |
| 检测和搜索列表元素 | 嵌套列表的重排 |
{3, 5, 1}{3, 5, 1} ^ 2 + 1{6, 7, 8} - {3.5, 4, 2.5}%Exp[%]//Nv = {2, 4, 3.1}v / (v - 1)在 "产生对象的列表" 节中我们已经讨论过列表,在那里是作为一种把多个数放在一起的方式. 在这一节中,将看到使用列表的许多不同方式. 用户将发现列表是 Wolfram 语言中最灵活和最强有力的对象之一. 将看到 Wolfram 语言列表是数学和计算机科学中的一些标准概念的一般化.
{2, 3, 4}x ^ % - 1D[%, x]% /. x -> 3Wolfram 语言内部的数学函数大多被设置成 “可列表的”,使其能分别作用于列表的每一个元素. 然而,并不一定 Wolfram 语言的所有函数都能做到这一点. 除非用户专门设置. 用户引入新函数 f 把列表作为单个对象进行处理. "函数作用于表达式的部分项" 和 "结构的操作" 将介绍如何用 Map 和 Thread 使一个函数分别地作用于列表的每个元素.
Table[i ^ 2, {i, 6}]Table[Sin[n / 5], {n, 0, 4}]N[%]Table[x ^ i + 2i, {i, 5}]Product[x ^ i + 2i, {i, 5}]Table[Sqrt[x], {x, 0, 1, 0.25}]可以在从 Table 中得到的列表上进行其他运算:
% ^ 2 + 3%//TableFormTable[x ^ i + y ^ j, {i, 3}, {j, 2}]Table[x, {4}]Table[RandomSample[{1, 2, 3, 4}, 2], {4}]Table[Sqrt[i], {i, {1, 4, 9, 16}}]Table[i + 2j, {i, 3}, {j, 2}]Table[i + 2j, {i, 3}, {j, i}]可以使用 Table 生成具有任意维度的数组.
Table[i j ^ 2 k ^ 3, {i, 2}, {j, 2}, {k, 2}]| Table[f,{imax}] | 给出 f 的 imax 个值的列表 |
| Table[f,{i,imax}] | 给出 f 的 i 从 1 到 imax 的列表 |
| Table[f,{i,imin,imax}] | 给出 i 从 imin 到 imax 的列表 |
| Table[f,{i,imin,imax,di}] | 使用 di 为步长 |
| Table[f,{i,imin,imax},{j,jmin,jmax},…] | 生成多维表 |
| Table[f,{i,{i1,i2,…}] | 给出当 i 连续取值 i1, i2, … 时 f 的值的列表 |
| TableForm[list] | 把列表显示为表格形式 |
sq = Table[j ^ 2, {j, 7}]sq[[3]]sq[[3 ;; 5]]m = Table[i - j, {i, 2}, {j, 2}]m[[1]]%[[2]]m[[1, 2]]TableForm[m]| t[[i]] or Part[t,i] | 给出 t 的 i 个子列表(也作为 t〚i〛 输入) |
| t[[i;;j]] or Part[t,i;;j] | 给出从 i 到 j 的部分列表 |
| t[[{i1,i2,…}]] or Part[t,{i1,i2,…}] | 给出 t 的 i1,i2,… 部分构成的列表 |
| t[[i,j,…]] or Part[t,i,j,…] | 给出 t 的相应于 t[[i]][[j]]… 的部分元素列表 |
| {a,b,c} | 一个列表 |
| Part[list,i] or list[[i]] | 列表 list 的第 i 个元素(第一个元素为 list[[1]]) |
| Part[list,{i,j,…}] or list[[{i,j,…}]] | 列表 list 的第 i,第 j,… 个元素组成的列表 |
| Part[list,i;;j] | 列表 list 的第 i 到第 j 个元素组成的列表 |
{5, 8, 6, 9}[[2]]{5, 8, 6, 9}[[{3, 1, 3, 2, 4}]]v = {2, 4, 7}v[[2]]v = {4, -1, 8, 7}v[[3]] = 0vm = {{a, b}, {c, d}}m[[1]]m[[1, 2]]v = {x, y}p v + qv + {xp, yp} + {xpp, ypp}{x, y}.{xp, yp}m.vm.mv.mv.m.v| Table[f,{i,n}] | 通过计算 i=1,2,…,n 时 f 的值,构造一个 n 维向量 |
| Array[a,n] | 构造形如 {a[1],a[2],…} 的 n 维向量 |
| Range[n] | 建立列表 {1,2,3,…,n} |
| Range[n1,n2] | 建立列表 {n1,n1+1,…,n2} |
| Range[n1,n2,dn] | 建立列表 {n1,n1+dn,…,n2} |
| list[[i]] or Part[list,i] | 取出向量 list 的第 i 个元素 |
| Length[list] | 给出 list 的元素个数 |
| c v | 数乘向量 |
| a.b | 向量的点积 |
| Cross[a,b] | 向量的叉积(也输入为 a×b) |
| Norm[v] | 向量的欧式范数(norm) |
| Table[f,{i,m},{j,n}] | 通过计算 i 从 1 到 m,j 从 1 到 n 的 f 的值,构造一个 m×n 矩阵 |
| Array[a,{m,n}] | 构造一个 m×n 矩阵,其第 i,j 个元素为 a[i,j] |
| IdentityMatrix[n] | 生成一个 n×n 单位矩阵 |
| DiagonalMatrix[list] | 生成一个对角线上的元素为 list 的对角阵 |
| list[[i]] or Part[list,i] | 给出矩阵 list 的第 i 行 |
| list[[All,j]] or Part[list,All,j] | 给出矩阵 list 的第 j 列 |
| list[[i,j]] or Part[list,i,j] | 给出矩阵 list 的第 i,j 个元素 |
| Dimensions[list] | 给出矩阵 list 的维数 |
| Column[list] | 在一个列中显示 list 的元素 |
| MatrixForm[list] | 用矩阵形式显示 list |
s = Table[i + j, {i, 3}, {j, 3}]MatrixForm[s]Array[a, 4]Array[p, {3, 2}]Dimensions[%]DiagonalMatrix[{a, b, c}]| c m | 用数乘以矩阵 |
| a.b | 两个矩阵的点积 |
| Inverse[m] | 矩阵的逆 |
| MatrixPower[m,n] | 矩阵的 n 次幂 |
| Det[m] | 矩阵的行列式 |
| Tr[m] | 矩阵的迹 |
| Transpose[m] | 矩阵的转置 |
| Eigenvalues[m] | 矩阵的特征值 |
| Eigenvectors[m] | 矩阵的特征向量 |
mDet[m]Transpose[m]Inverse[m]h = Table[1 / (i + j - 1), {i, 3}, {j, 3}]Inverse[h]%.hr = Table[i + j + 1, {i, 3}, {j, 3}]Eigenvalues 给出矩阵的特征值:
Eigenvalues[r]rn = N[r]Eigenvalues[rn]| First[list] | list的第一个元素 |
| Last[list] | list 的最后一个元素 |
| Part[list,n] or list[[n]] | list 的第 n 个元素 |
| Part[list,-n] or list[[-n]] | 倒数第 n 个元素 |
| Part[list,m;;n] | 从第 m 到第 n 个元素 |
| Part[list,{n1,n2,…}] or list[[{n1,n2,…}]] | |
由第 n1, n2, … 个元素组成的列表 | |
t = {a, b, c, d, e, f, g}Last[t]t[[3]]t[[3 ;; 6]]t[[{1, 4}]]| Take[list,n] | list 的前 n 个元素 |
| Take[list,-n] | list 的后 n 个元素 |
| Take[list,{m,n}] | list 中从 m 到 n 的元素 |
| Rest[list] | 去掉 list 的第一个元素 |
| Drop[list,n] | 去掉 list 的前 n 个元素 |
| Most[list] | 去掉 list 的最后一个元素 |
| Drop[list,-n] | 去掉 list 的后 n 个元素 |
| Drop[list,{m,n}] | 去掉 list 的从第 m 到第 n 个间的元素 |
Take[t, 3]Take[t, -3]Take[t, {2, 5}]Take[t, {3, 7, 2}]Rest[t]Drop[t, 3]Drop[t, {3, 3}]"同类列表的操作" 节将介绍如何将本节的所有函数推广到不仅用于列表,而且用于各种 Wolfram 语言表达式.
本节的函数允许用户提取列表中特定位置上的元素. "寻找与模式匹配的表达式" 节将介绍如何使用像 Select 和 Cases 这样的函数提取列表元素. 他们不是根据元素的位置,而是根据元素的特征进行提取.
| Position[list,form] | form 在 list 中的位置 |
| Count[list,form] | form 作为 list 的元素所给出的次数 |
| MemberQ[list,form] | 检测 form 是否为 list 的元素 |
| FreeQ[list,form] | 检测 form 是否不在 list 中 |
"获得列表的部分元素" 讨论如何根据元素的位置或标号提取列表的元素. Wolfram 系统也有根据元素的值搜索和检测列表元素的函数.
Position[{a, b, c, a, b}, a]Count[{a, b, c, a, b}, a]MemberQ[{a, b, c}, a]MemberQ[{a, b, c}, d]m = IdentityMatrix[3]FreeQ[m, 0]Position[m, 0]| Prepend[list,element] | 在 list 的开头添加元素 element |
| Append[list,element] | 在 list 的末尾添加元素 element |
| Insert[list,element,i] | 在 list 的第 i 个位置上插入 element |
| Insert[list,element,-i] | 在 list 的倒数第 i 个位置上插入 element |
| Riffle[list,element] | 在 list 的位置上交错放置 element |
| Delete[list,i] | 去掉 list 的第 i 个位置上的元素 |
| ReplacePart[list,i->new] | 用 new 替换 list 的第 i 个位置上的元素 |
| ReplacePart[list,{i,j}->new] | 用 new 替换 list[[i,j]] |
Prepend[{a, b, c}, x]Insert[{a, b, c}, x, 2]Riffle[{a, b, c}, x]ReplacePart[{a, b, c, d}, 3 -> x]ReplacePart[{{a, b}, {c, d}}, {1, 2} -> x]函数如 ReplacePart 用明确的列表产生新的列表. 然而,用户有时可能想要在合适的位置修改一个列表,而不明确产生一个新的列表.
v = {a, b, c, d}v[[3]] = xv| m[[i,j]]=new | 替换矩阵的第 (i,j) 个元素 |
| m[[i]]=new | 替换第 i 行 |
| m[[All,i]]=new | 替换第 i 列 |
m = {{a, b}, {c, d}}m[[All, 1]] = {x, y};mm[[All, 1]] = 0;m| Join[list1,list2,…] | 把列表连接在一起 |
| Union[list1,list2,…] | 列表的并(合并列表,删除重复的元素,并整理结果) |
| Riffle[list1,list2] | 交错放置 list1 和 list2 的元素 |
Join 可以连接任意多个列表:
Join[{a, b, c}, {x, y}, {t, u}]Union 合并列表,且保持列表中只有不同元素:
Union[{a, b, c}, {c, a, d}, {a, d}]Riffle 通过交错放置列表的元素合并列表:
Riffle[{a, b, c}, {x, y, z}]| Union[list1,list2,…] | 给出 listi 中不同元素的列表 |
| Intersection[list1,list2,…] | 给出 listi 中共有的元素的列表 |
| Complement[universal,list1,…] | 给出在 universal 中,但不在 listi 中的元素的列表 |
| Subsets[list] | 给出 list 中元素的所有子集的列表 |
| DeleteDuplicates[list] | 从 list 中删除所有重复元素 |
Union 给出在任一个列表中出现的元素:
Union[{c, a, b}, {d, a, c}, {a, e}]Intersection 给出在所有集合中都出现的元素:
Intersection[{a, c, b}, {b, a, d, a}]Complement 给出在第 1 个集合出现,而不在其他集合中出现的元素:
Complement[{a, b, c, d}, {a, d}]Subsets[{a, b, c}]DeleteDuplicates 从列表中删除所有重复元素:
DeleteDuplicates[{a, b, c, a}]| Sort[list] | 把列表 list 元素整理成标准顺序 |
| Union[list] | 整理元素,删除重复元素 |
| Reverse[list] | 对 list 的元素进行反向排序 |
| RotateLeft[list,n] | 把列表 list 元素向左轮换 n 个位置 |
| RotateRight[list,n] | 把列表元素向右轮换 n 个位置 |
Sort[{b, a, c, a, b}]Union[{b, a, c, a, b}]RotateLeft[{a, b, c, d, e}, 2]可以通过给出负位移或使用 RotateRight 进行向右轮换:
RotateLeft[{a, b, c, d, e}, -2]PadLeft[{a, b, c}, 10, x]| Partition[list,n] | 把 list 分成 n 个元素一组 |
| Partition[list,n,d] | 使用偏移 d 进行逐次分组 |
| Split[list] | 把 list 按邻接的相同元素进行分组 |
| SplitBy[list,f] | 当应用 f 时,将 list 分为具有相同值得参数运行 |
| Gather[list] | 将 list 的参数收集到相同参数的子列表中 |
| GatherBy[list,f] | 当应用 f 时,将列表的参数收集到具有相同值的子列表中 |
t = {a, b, c, d, e, f, g}Partition[t, 2]Partition[t, 3]Partition[t, 3, 1]Split[{a, a, b, b, b, a, a, a, b}]t = RandomInteger[10, 20]SplitBy[t, EvenQ]Gather[t]GatherBy[t, Mod[#, 3]&]Tuples[{a, b}, 2]Tuples[{{a, b}, {1, 2, 3}}]| Sort[list] | 把 list 中的元素按顺序排列 |
| Ordering[list] | Sort[list] 中 list 元素的位置 |
| Ordering[list,n] | Ordering[list] 的前 n 个元素 |
| Ordering[list,-n] | Ordering[list] 的最后 n 个元素 |
| Permutations[list] | list 的所有可能排序 |
| Min[list] | list 中的最小元素 |
| Max[list] | list 中的最大元素 |
t = {17, 21, 14, 9, 18}Sort[t]Ordering[t]与 Sort[t] 产生相同的结果:
t[[%]]Min[t]| Flatten[list] | 压平 list 的所有层 |
| Flatten[list,n] | 压平 list 的前 n 层 |
| Partition[list,{n1,n2,…}] | 分成大小为 n1×n2×… 的块 |
| Transpose[list] | 交换列表的前两层 |
| RotateLeft[list,{n1,n2,…}] | 将层逐次轮换 ni 个位置 |
| PadLeft[list,{n1,n2,…}] | 把第 i 层填充为长为 ni 的子列表 |
Flatten[{{a}, {b, {c}}, {d}}]Flatten[{{a}, {b, {c}}, {d}}, 1]对嵌套列表还有许多其他运算. 在 "操作列表" 中将讨论更多操作.