续 part2

切片 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的升序顺序。

其他的数据存储后续另起记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值