列表,元素和序列

列表类型保存任意类型的元素。和C,C++等一样(但是和多数标准的计算机代数系统不一样),列表中的元素下标从0开始计数。

  1. sage: v =[2, 3, 5, 'x', SymmetricGroup(3)]; v
  2. [2, 3, 5, 'x', Symmetric group of order 3! as a permutation group]
  3. sage: type(v)
  4. <... 'list'>
  5. sage: v[0]
  6. 2
  7. sage: v[2]
  8. 5

(索引一个列表时,如果下标不是Python整数类型也是可以的!)Sage整数(或有理数,或其他有__index__方法的对象)都可以正常索引。

  1. sage: v =[1,2,3]
  2. sage: v[2]
  3. 3
  4. sage: n = 2 #SageInteger
  5. sage: v[n] # Perfectly OK!
  6. 3
  7. sage: v[int(n)] # Also OK.
  8. 3

range函数新建一个Python整数(不是Sage整数)的列表:

  1. sage: range(1, 15) # py2
  2. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

使用包含列表(list comprehension)的方式构造列表是非常有用的:

  1. sage: L =[factor(n) for n in range(1, 15)]
  2. sage: L
  3. [1, 2, 3, 2^2, 5, 2 * 3, 7, 2^3, 3^2, 2 * 5, 11, 2^2 * 3, 13, 2 * 7]
  4. sage: L[12]
  5. 13
  6. sage: type(L[12])
  7. <class 'sage.structure.factorization_integer.IntegerFactorization'>
  8. sage:[factor(n) for n in range(1, 15) if is_odd(n)]
  9. [1, 3, 5, 7, 3^2, 11, 13]

更多关于如何使用包含列表创建列表的内容,请参见PyT.

列表切片(list slicing)是一个有趣的功能。若L是一个列表, 那么L[m:n]返回L的一个子列表,从第$m$个元素开始到第$n-1$个元素,象下面这样。

  1. sage: L =[factor(n) for n in range(1, 20)]
  2. sage: L[4:9]
  3. [5, 2 * 3, 7, 2^3, 3^2]
  4. sage: print L[:4]
  5. [1, 2, 3, 2^2]
  6. sage: L[14:4]
  7. []
  8. sage: L[14:]
  9. [3 * 5, 2^4, 17, 2 * 3^2, 19]

元组(tuple)与列表类似,除了它们是固定的,也就是说,一旦它们被建立,就不能再被修改。

  1. sage: v = (1,2,3,4); v
  2. (1, 2, 3, 4)
  3. sage: type(v)
  4. <... 'tuple'>
  5. sage: v[1]= 5
  6. Traceback (most recent call last):
  7. ...
  8. TypeError: 'tuple' object does not support item assignment

序列(sequence)是第三种面向列表的Sage类型。与列表和元组不同,序列不是Python内置的类型。序列默认是可修改的,但是可以使用Sequence类中的set_immutable方法设置成不能修改的,如下例所示。一个序列中的所有元素都有共同的祖先(parent), 称为序列的领域(sequences universe)。

  1. sage: v = Sequence([1,2,3,4/5])
  2. sage: v
  3. [1, 2, 3, 4/5]
  4. sage: type(v)
  5. <class 'sage.structure.sequence.Sequence_generic'>
  6. sage: type(v[1])
  7. <type 'sage.rings.rational.Rational'>
  8. sage: v.universe()
  9. Rational Field
  10. sage: v.is_immutable()
  11. False
  12. sage: v.set_immutable()
  13. sage: v[0]= 3
  14. Traceback (most recent call last):
  15. ...
  16. ValueError: object is immutable; please change a copy instead.

序列是从列表继承下来的,可用于任何列表可用的地方:

  1. sage: v = Sequence([1,2,3,4/5])
  2. sage: isinstance(v, list)
  3. True
  4. sage: list(v)
  5. [1, 2, 3, 4/5]
  6. sage: type(list(v))
  7. <... 'list'>

另外一个例子,向量空间的基是不可修改的序列, 因为你不能修改它们。

  1. sage: V = QQ^3; B = V.basis(); B
  2. [
  3. (1, 0, 0),
  4. (0, 1, 0),
  5. (0, 0, 1)
  6. ]
  7. sage: type(B)
  8. <class 'sage.structure.sequence.Sequence_generic'>
  9. sage: B[0]= B[1]
  10. Traceback (most recent call last):
  11. ...
  12. ValueError: object is immutable; please change a copy instead.
  13. sage: B.universe()
  14. Vector space of dimension 3 over Rational Field