切片 slice
s[a: b :c]的形式可以对s在a和b之间以c为间隔取值。
c值可以为负,反着取,反转字符串可用
s = 'bicycle'
s[::-1]
>'elcycib'
给切片进行赋值:
赋值对象是切片则赋值语句也应该是个可迭代对象。
建立由列表组成的列表
board = [[' '] * 3 for i in range(3)]
print(board)
board[1][2] = 'x'
print(board)
>[[' ', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']]
[[' ', ' ', ' '], [' ', ' ', 'x'], [' ', ' ', ' ']]
board = [[' '] * 3]*3
print(board)
board[1][2] = 'x'
print(board)
结果为指向同一个对象
>[[' ', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']]
[[' ', ' ', 'x'], [' ', ' ', 'x'], [' ', ' ', 'x']]
+=(*=)
+=特殊方法为__iadd__(*=为__imul__),就地加法
如果没有实现__iadd__的话,python就会调用__add__
对于可变序列
一般都实现了__iadd__,a会就地改动,像调用了a.extend(b)一样。
增量乘法后列表id没变,新元素追加到列表上。
对于不可变序列
没有实现__iadd__, 因此a+=b的效果就会等效于a = a + b,首先计算a+b, 得到一个新的对象再复制给a。
可以看出新的元组被创建。
对不可变序列进行重复拼接操作的效率很低,因为每次都会有一个新对象,解释器需要把原来对象中的元素先复制到新的对象里,再追加新的元素
list.sort 和 sorted
list.sort会就地排序列表,而不是把原列表复制一份,所以这个方法的返回值是None(同reverse),以便让调用者知道传入的参数发生了变动并且没有产生新的对象。而sorted会新建一个列表作为返回值。(方法reversed( )会返回迭代器名称,需要再加一个list())
两个可选的参数
reverse=True or False
key
这个函数会被用到序列的每一个元素上,所产生的结果是排序所以来的对比关键字。
key=str.lower实现忽略大小写的排序
key=len进行基于字符串长度的排序
bisect(v.二等分)管理已排序的序列
bisect模块包含两个主要函数,bisect和insort,利用二分查找算法在序列中查找或者插入元素。
bisect(hystack, needle)
在haystack中搜索needle的位置,使得把needle插入该位置后,haystack还能保持升序,这也就意味着haystack必须是一个有序的序列。
可以先用该函数查找插入的位置的index。
import bisect
import sys
HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20,
21, 23, 23, 26, 29, 30]
NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23,
29, 30, 31]
ROW_FMT = '{0:2d} @ {1:2d} {2}{0:^2d}'
def demo(bisect_fn):
for needle in reversed(NEEDLES):
position = bisect_fn(HAYSTACK, needle)#get the index
offset = position * ' |'#get (intex)th |
print(ROW_FMT.format(needle, position, offset))
if __name__ == '__main__':
if sys.argv[-1] == 'left':
bisect_fn = bisect.bisect_left
else:
bisect_fn = bisect.bisect_right
demo(bisect_fn)
bisect可以用lo,hi来缩小寻找的范围,lo的默认值是0,hi的默认值是序列的长度。
其中bisect别名bisect_right,bisect_left插入的位置在第一个与之相等的值处。
bisect可以用来建立一个用数字为索引的查询表格,比如说把分数和成绩对应起来。
import bisect
def grade_match(score, breakpoints= [60, 70, 80, 90], grades='F D C B A'):
l = int(bisect.bisect(breakpoints, score))
return grades[l]
下面是bisect.insort插入新元素。
random.seed
random.randrange
import bisect
import random
SIZE = 7
random.seed(5)
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)
其中insort(seq, item)会把变量item插入到序列seq中,并且能够保持seq的升序顺序。
其他的数据存储后续另起记录。