1.对序列使用+和*

        通常+号两边的序列是由相同类型的数据构成,在操作过程中,两个被操作的序列都不会被修改,Python会创建一个新的包含相同数据类型的序列作为拼接的结果。

       如果想要复制几份然后拼接起来,最方便的做法就是把这个序列乘(*)一个整数。*号同样也遵循不修改原有的操作对象,而创建一个新对象这一规律。

a = [1, 2, 3]
b = a*3
print(b)

2.由列表组成的列表

        有时我们需要初始化一个嵌套这几个列表的列表。并且可以用一下的方式修改列表中的值。但要注意的是,如果直接用a*n的形式创建一个由列表组成的列表,且a中的元素是对其他可变对象的引用时,要注意一旦对其中一个元素进行修改,列表中对应位置的元素都会被修改。因为列表内的三个引用都指向了同一的对象。

board = [['_']*3 for i in range(3)]
print(board)
board[1][2] = 'X'
print(board)

3.序列的增量赋值

        增量赋值运算符+=和*=的表现取决于他们的第一个操作对象。如果第一个操作对象是可变序列,如:列表,那么列表的ID是不变的,新元素追加到列表上。如果第一个操作对象是不可变序列,如:元组,那么元组的ID是会被改变的,新的元组会被创建。

        所以,不要把可变对象放到元组里。

4.排序——sorted()和list.sort()

        list.sorted()方法是就地排序,即不会产生新的列表,而是在原列表的基础上进行排序。它的返回值为None,意思就是就地改动,不会产生一个新的列表。而sorted方法则是会创建一个新的列表,在新的列表上进行排序。

        这两个方法都接受以下这两个的关键字参数:

     (1)reverse:默认为False,序列进行升序排序。一旦改成Ture,那么序列里的元素会以降序输出。

     (2)key:一个只有一个参数的函数,这个函数会被用在序列里的每一个元素上,所产生的结果将是排序算法所依赖的对比关键字。如key=len,即以元素长度进行排序。

5.用bisect来管理已排序的序列

        bisect模块包含两个主要函数,bisect和insort,两个函数都利用二分查找算法在有序序列中查找和插入元素。

5.1用bisect进行搜索

        bisect(haystack,needle)就是在haystack(升序序列)中搜索needle的位置,该位置满足的条件needle插入特定位置后,haystack还能保持升序排序。也就是说其返回位置前面的值都是小于等于needle值。

5.2用bisect.insort()插入新元素

        排序很耗时,因此在排序完成后,我们希望能保持这个形式。而insort()方法就是为此而产生。

        insort(seq,item)就是把变量item插入到seq序列中,并保持seq的升序排序。

import bisect
import random

SIZE = 7
random.seed(1729)
my_list = []
for i in range(SIZE):
    new_item = random.randrange(SIZE*2)
    bisect.insort(my_list, new_item)
    print('%2d ->' % new_item, my_list)