Tcler 的 Python 学习概要:List

List / 列表

List 广义的来说,指一个序列,下面这些类似的概念都可以认为是一个 List

  • C/C++ 以及很多程序语言里面的数组
  • Tcl 语言里面的 list
  • Python 语言里面的 Sequence

List主要特征是一组元素的有序排列,可以通过数值下标来访问其中第n个元素。

根据这个特征来说,

  • 计算机的内存是一个list, 元素是字节。
  • 程序的指令是一个list,元素是单个指令。
  • 字符串是一个list, 元素是字符——通常是可打印字符。
  • 日复一日是一个list,元素可以是日、月、年、星期等。
  • 搜索引擎的查询结果可以看作是一个排序后的list
  • 考试或比赛的排名可以看作是对list的排序

List是很基本的数据结构,很多问题或算法的实质都可以归纳为对list的改动、查找、排序等操作。

list 的基本操作

操作 Tcl Python
创建 set alist [list 1 2 3] alist = [1, 2, 3]
长度 llength $alist len(alist)
索引 lindex $alist 0 alist[0]
改动 lset alist 0 9 alist[0] = 9
区间 lrange $alist 1 2 alist[1:3]
追加 lappend alist 4 alist.append(4)
合并 concat $alist {7 8 9} alist + [7, 8, 9]
删除 lreplace $alist 2 3 alist[2:4] = []
插入 linsert $alist 2 $x alist = alist[0:2] + [x] + alist[2:]
最小值 lindex [lsort $alist] 0 min(alist)
计数 llength [lsearch $alist $x] alist.count(x)
查找 lsearch $alist $x alist.index(x)
存在 $x in $alist x in alist
  • alist[1:3] 这种区间索引等效于索引区间 [1, 3)

list的遍历

foreach item $tcl_list {
  puts $item
}
for item in $python_list:
  print($item)

turple = 只读的 list

turple 可以看作是 readonly list 或者叫做 immutable list。

python_turple = (1, 2, 3)

range = 只读的自然数序列

range(start, stop) 返回自然数区间 [stop, stop)。range返回的序列是只读的(immutable)。

用Tcl代码表示range的效果的话,类似于:


proc range {start stop {step 1}} {
  set result [list]
  while { $start < $stop } {
    lappend result $start
    incr start $step
  }
  return $result
}

str 是字符组成的 list

Python里的str类型是字符组成的 list。

由于字符串类型过于常见,因而单独作为一种数据类型,并提供相应的函数以便于操作。但从概念实质上来讲,就是一个list。

与此类似的还有 Erlang 里面的字符串。

bytes 和 bytearray 是字节组成的 list

str类型里面的字符通常是可读字符。但程序世界毕竟是以字节为单位的。

Python里的bytes类型,是由字节的组成的list,可以表示任何二进制数据。

这里的字节可以认为是一个 unsigned char,即一个大小在[0, 255]之内的整数。

bytes 类型是只读的(immutable),bytearray类型则是可写的(muttable)。

memoryview 是内存单元组成的 list

bytes和bytearray类型的元素都是单个字节,但程序世界里很多时候会把一组连续的自己当作一个整体处理。如果list的元素不再限定为单个字节,而是允许连续的多个字节,那么就是memoryview了,即元素是一块内存单元的list。