列表,元素和序列
列表类型保存任意类型的元素。和C,C++等一样(但是和多数标准的计算机代数系统不一样),列表中的元素下标从0开始计数。
sage: v =[2, 3, 5, 'x', SymmetricGroup(3)]; v
[2, 3, 5, 'x', Symmetric group of order 3! as a permutation group]
sage: type(v)
<... 'list'>
sage: v[0]
2
sage: v[2]
5
(索引一个列表时,如果下标不是Python整数类型也是可以的!)Sage整数(或有理数,或其他有__index__
方法的对象)都可以正常索引。
sage: v =[1,2,3]
sage: v[2]
3
sage: n = 2 #SageInteger
sage: v[n] # Perfectly OK!
3
sage: v[int(n)] # Also OK.
3
range
函数新建一个Python整数(不是Sage整数)的列表:
sage: range(1, 15) # py2
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
使用包含列表(list comprehension)的方式构造列表是非常有用的:
sage: L =[factor(n) for n in range(1, 15)]
sage: L
[1, 2, 3, 2^2, 5, 2 * 3, 7, 2^3, 3^2, 2 * 5, 11, 2^2 * 3, 13, 2 * 7]
sage: L[12]
13
sage: type(L[12])
<class 'sage.structure.factorization_integer.IntegerFactorization'>
sage:[factor(n) for n in range(1, 15) if is_odd(n)]
[1, 3, 5, 7, 3^2, 11, 13]
更多关于如何使用包含列表创建列表的内容,请参见PyT.
列表切片(list slicing)是一个有趣的功能。若L
是一个列表, 那么L[m:n]
返回L
的一个子列表,从第$m$个元素开始到第$n-1$个元素,象下面这样。
sage: L =[factor(n) for n in range(1, 20)]
sage: L[4:9]
[5, 2 * 3, 7, 2^3, 3^2]
sage: print L[:4]
[1, 2, 3, 2^2]
sage: L[14:4]
[]
sage: L[14:]
[3 * 5, 2^4, 17, 2 * 3^2, 19]
元组(tuple)与列表类似,除了它们是固定的,也就是说,一旦它们被建立,就不能再被修改。
sage: v = (1,2,3,4); v
(1, 2, 3, 4)
sage: type(v)
<... 'tuple'>
sage: v[1]= 5
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment
序列(sequence)是第三种面向列表的Sage类型。与列表和元组不同,序列不是Python内置的类型。序列默认是可修改的,但是可以使用Sequence
类中的set_immutable
方法设置成不能修改的,如下例所示。一个序列中的所有元素都有共同的祖先(parent), 称为序列的领域(sequences universe)。
sage: v = Sequence([1,2,3,4/5])
sage: v
[1, 2, 3, 4/5]
sage: type(v)
<class 'sage.structure.sequence.Sequence_generic'>
sage: type(v[1])
<type 'sage.rings.rational.Rational'>
sage: v.universe()
Rational Field
sage: v.is_immutable()
False
sage: v.set_immutable()
sage: v[0]= 3
Traceback (most recent call last):
...
ValueError: object is immutable; please change a copy instead.
序列是从列表继承下来的,可用于任何列表可用的地方:
sage: v = Sequence([1,2,3,4/5])
sage: isinstance(v, list)
True
sage: list(v)
[1, 2, 3, 4/5]
sage: type(list(v))
<... 'list'>
另外一个例子,向量空间的基是不可修改的序列, 因为你不能修改它们。
sage: V = QQ^3; B = V.basis(); B
[
(1, 0, 0),
(0, 1, 0),
(0, 0, 1)
]
sage: type(B)
<class 'sage.structure.sequence.Sequence_generic'>
sage: B[0]= B[1]
Traceback (most recent call last):
...
ValueError: object is immutable; please change a copy instead.
sage: B.universe()
Vector space of dimension 3 over Rational Field