python(8): list


               
                list在python是一种有顺序的、可变的类型,list的成员可以是任何一种python类型,甚至也包括list,也就是list可以作为另一个list的成员。在list中,实际上保存的只是每一个成员对象的指针。在cpython中,list后台实现用的就是c中的数组。
list的表示形式用的是一对中括号,成员用逗号隔开:
  • [成员1, 成员2, 成员3...]
由于是list是有顺序的,因此list可以使用类似于string分片的方法访问list的成员。也可以用+进行连接,用*进行扩展,只是需要注意用+进行连接操作时,+两边的都必须是list。还可以用for ... in ...的形式进行循环运算。list的创建可以使用直接书写的形式,也可以使用内置函数list(seq)把序列类型的seq转成list。还可以使用range([start,]stop[.step])来生成以一系列整数为成员的list。内置函数list(seq)可以把任何序列类型的seq转换为list类型。
list的两大特点是:有顺序的、可变的。由于第一个特点,list可以使用类似于string的分片的方法进行操作。由于第二个特点可以直接改变list而不用创建新的list,可以直接对list进行增、删、改的操作。一定要记住,有些操作不会返回一个新的list。下面一个一个来看。
计算一个list中有几个成员,类似于string,这个函数是len(),是内置的。会返回一个int值。
往一个list中增加成员有多种方法,一种是用"分片"技术,另一中是调用list的专属函数,还可以使用+。
  • >>> L=range(3)
    • >>> L
    •     [0, 1, 2]
    • >>> L[len(L)] = 3
    • >>> L
    •     [0, 1, 2, 3]
    • >>> L.append(4)
    • >>> L
    •     [0, 1, 2, 3, 4]
    • >>> L.extend([5, 6])
    • >>> L
    •     [0, 1, 2, 3, 4, 5, 6]
    • >>> L = L + [7]
    • >>> L
    •     [0, 1, 2, 3, 4, 5, 6, 7]
      第1行创建一个list。第4行就是用分片的方法进行了增加成员的操作。L[len(L)]实际上是L[3],第4行作用相当于在list的最后增加了一个成员,即L[3] = 3。相同地往list的头上增加成员,可以用L[:0]= -1。第7行是用list专属函数append()给list增加了一个成员,它也是在list的最后增加一个成员。append()只可以往list中增加一个成员,也就是说,如果传给这个函数的是一个list,那么append()只会把这个list整体作为一个成员加到原来的list中。这里还要注意的是。第7行不会返回一个新的list,它返回的值是None,它的作用是直接改变了L,这与string是不一样的,因为list是可变的,而string是不可变的,如果是string的话,这行要类似地写成S=S.replace('e','d')。第10行是list专属的另一个函数,它也是向list的最后添加成员,与append()不同的是,它的参数必须是一个“sequence”类型的,它把这个sequence的每个成员作为list的成员加进去。第13行,用的是+。与第7行不同,L + [7]会生成一个新的list,因此需要把这个新的list重新赋给L。
      再来看看list的删除操作。
    • >>> L
    •     [0, 1, 2, 3, 4, 5, 6, 7]
    • >>> L[7:]=[]
    • >>> L
    •     [0, 1, 2, 3, 4, 5, 6]
    • >>> L.pop()
    • >>> L
    •     [0, 1, 2, 3, 4, 5]
    • >>> del L[5]
    • >>> L
    •     [0, 1, 2, 3, 4]第3行用的是分片的方法。注意这里不能写成L[7]=[],这样的话会把[]这个空的list作为一个成员替换掉7,也就是说L会变成[0, 1, 2, 3, 4, 5, 6, []]。这是因为L[7]代表的是一个值,在这里是一个整数。而L[7:]代表的是list,哪怕它只有一个成员。第6行用的是list专属的pop([index])函数,默认的是弹出最后一个成员,当然也可以用index来指定弹出哪一个值。第9行用的是del关键字。这有点类似于print,也是python的关键字。
      list的改操作。
    • >>> L
    •     [0, 1, 2, 3, 4]
    • >>> L[1:3]=['a', 'b', 'c']
    • >>> L
    •     [0, 'a', 'b', 'c', 4]
    • >>> L[0] = "helo"
    • >>> L
    •     ['helo', 'a', 'b', 'c', 4]第3行要重点看一看,L[1:3]表示是的[1, 2]有两个成员,而['a', 'b', 'c']有三个成员,好像相互不匹配。其实可以把改的操作理解为两步,一步是删除,第二步是在删除的位置插入,这样就好理解了。第6行也好理解。
      除了上面提到的一些专属函数外,list还有一些专属函数:
      • L.append(object)
      • L.extend(seq)
      • L.pop([index])
      • L.count(value)  #计算value在L中出现的次数
      • L.sort([cmp[, key[, reverse]]])  
        #对L进行排序。cmp是一个比较函数,它有两个参数,只能返回-1 0 1 中的一个,分别表示第一个参数比第二个参数小 相等 大。key也是一个函数,只有一个参数,用来给这个参数产生一个用于比较的标志,比如说它可以把所有东西都转成字符串,然后再来比较。reverse是一个bool值,为真时表示,降序排列。在python2.4之后,才可以使用key和reverse参数,cmp可以为None,表示忽略cmp函数。
      • L.reverse()  #颠倒L
      • L.index(x[,start[,end]])  #返回x在list第一次出现的标号
      • L.insert(i, x)  #相当于L[i:i]= [x]
      • L.remove(x)   #相当于del L[L.index(x)]