[3]自定义序列类

序列分类

按存储的数据进行分类

  • 容器序列,能够存储任何类型的数据
    list,tuple,deque
  • 扁平序列,只能存储同一种类型的数据
    str,bytes,bytearray,array.array

按照存储的数据是否能改变进行分类

  • 可变序列
    list,deque,bytearray,array
  • 不可变序列
    str,tuple,bytes

+,+=、extend、append的区别

  • +号两边的类必须一致。例如,如果一个list加tuple会报错
  • +=允许两边的类型不一致,内部会通过调用extend,迭代添加元素
  • extend,迭代添加元素
  • append,在列表中追加指定的一个元素

切片操作

list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


# [开始位置:结束位置:步长]
#开始位置默认为0
print("list[:3] => ", list[:3])
#结束位置默认为切片末尾
print("list[1:] => ", list[1:])
#开始、结束都省略截取完整的序列
print("list[:] => ", list[:])
#截取下标为偶数
print("list[::2] => ", list[::2])
#截取下标为基奇数
print("list[1::2] => ", list[1::2])
#反序
print("list[::-1] => ", list[::-1])
#删除尾部
l = list[:]
l[3:] = []
print('l[3:] = [] => ', l)
#删除头部
l = list[:]
l[:3] = []
print('l[:3] = [] => ', l)
#删除中间
l = list[:]
l[5:6] = []
print('l[5:6] = []=> ', l)
#头部添加
l = list[:]
l[:0] = ["a", "b"]
print('l[:0] = ["a", "b"]=> ', l)
#尾部追加
l = list[:]
l[len(l):] = ["a", "b"]
print('l[len(l):] = ["a", "b"]=> ', l)
#替换
l = list[:]
l[7:8] = ["a", "b", "d"]
print('l[3:5] = ["a", "b"]=> ', l)
#每隔一个,替换一个
l = list[:]
l[::2] = [0]*5
print('l[::2] = []=> ', l)

自定义序列类

import numbers

class Group:
    def __init__(self, company_name, group_name, staff):
        self.company_name = company_name
        self.group_name = group_name
        self.staff = staff
        pass
    
    # 需要实现__getitem__协议才能使用切片操作
    def __getitem__(self, item):
        # 希望切片返回的是Group实例而不是序列
        cls = type(self)
        if isinstance(item, slice):
            #重新将序列分装成Group实例
            return cls(self.company_name, self.group_name, self.staff[item])
        elif isinstance(item, numbers.Integral):
            #如果是通过下标访问Group,需要获取序列中的某个值,转成序列,再分装成Group实例
            return cls(self.company_name, self.group_name, [self.staff[item]])
    def __reversed__(self):
        pass
    def __iter__(self):
        pass

group = Group('HOME', "STUDY", ['tom', 'cat', 'fish', 'dog'])

print(group[:2].staff)
print(group[0].staff)

bisect 维护已排序的序列

通过bisect提供的方法实现

方法作用
insort_right(list,item)插入元素item,如果序列中存在相同的数值,向右边插入
insort_left(list,item)插入元素item,如果序列中存在相同的数值,向左边插入
ibisect_left(list,item)插入元素item,如果序列中存在相同的数值,向左边返回待插入的位置
bisect_right(list,item)插入元素item,如果序列中存在相同的数值,向右边返回待插入的位置
import bisect

list = [1, 3, 4, 5, 6, 6, 6, 7, 8, 9]

l1 = list[:]
bisect.insort_right(l1, 6.0)
print(l1)

l1 = list[:]
bisect.insort_left(l1, 6.0)
print(l1)

l1 = list[:]
print(bisect.bisect_right(l1, 6.0))#待插入的位置是7
l1 = list[:]
print(bisect.bisect_left(l1, 6.0))#待插入的位置是4

数组

数组的处理比列表高效,数组只能存放同一种数据

import array

arr = array.array('i')

arr.append(10)
arr.append(20)

for i in arr:
    print(i)

列表推导式、字典推导式、集合推导式、列表生成器

# 列表推导式
# 获取10以内的偶数
l = [i for i in range(10) if i % 2 == 0]
print(l)

# 字典推导式
# 将key和value 交换
dist = {10: 'tom', 20: 'cat', 30: 'pig'}
d = {value: key for key, value in dist.items()}
print(d)

# 集合推导式
# 获取字典的key
dist = {'name': 'tom', 'age': 10, 'sex': 'boy'}
s = {k for k in dist}
print(s)

# 列表生成器
gen = (i for i in range(20))
print(gen)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值