美文网首页
python笔记(六)数据类型 - 内置序列与字典

python笔记(六)数据类型 - 内置序列与字典

作者: 艺术家可达鸭 | 来源:发表于2018-12-15 19:15 被阅读3次

    序列是一种概念,而不是一个具体的类型。
    内置序列包括:list、set、tuple、str、range,字典不是序列哦。

    序列是一个实现了__getitem__(self, key)__len__(self)的 iterable,且只能用 int 作为下标(而不是 str)访问元素的对象

    内置序列与字典的特点

    • str:有序,元素不可重新赋值,长度不可变,非异构
    • list:有序,元素可重新赋值,长度可变,异构
    • tuple:有序,元素不可重新赋值,长度不可变,异构
    • dict:无序,元素可重新赋值,长度可变,异构
    • set:无序不重复,元素不可重新赋值(因为是无序的),长度可变,异构

    set 和 dict 是无序的,所以不能用数字做下标访问,但是可迭代
    set 和 dict 的键中保存的值必须是可哈希的,或者我理解为不可变的,他们可以保存 tuple,但是不能保存 list

    切片

    切片产生的是一个新的对象,这个对象中的元素是原序列中的元素句柄的副本

    seq[n:m]:取出下标n到m之间的元素,不包括m
    seq[:m]:前m个元素
    seq[-1]:最后一个元素
    切片默认的是正向取出元素的,即使使用负数作为下标
    seq[-3:-1]可以取出倒数第三个到倒数第一个(不包括)的元素
    但是seq[-1:-3]不能够反向取出倒数第一个到倒数第三个(不包括)的元素

    seq[::2]:不指定起始和结束索引就是所有元素,步长为2就是每两个一组,取出每组的第一个元素
    seq[9:4:-1]:使用步长可以反向输出元素

    给切片赋值,就像可以通过下标给元素赋值一样,也可以通过切片给元素赋值,ll[3::2] = [11, 22]
    要求是值的数量必须与切片元素的数量相等,且值必须是一个可迭代对象,即使它只有一个元素
    用del关键字配合切片可以删除原序列中的元素

    直接对切片操作(ll[3::2] = [11, 22])会影响原序列,而把切片赋值给变量(a=ll[3::2]),将产生新序列,新序列包含原序列的元素的句柄副本

    下标访问就是把 int 传给__getitem(self,key)__,而切片是把切片转成 slice 对象后,把 slice 对象传给__getitem(self,key)__

    切片中的数字超出序列范围也不会越界,而是返回空seq,但是单个下标是会越界的

    浅拷贝与深拷贝

    等号(=):复制原有的引用

    浅拷贝:序列的 copy 方法或 copy 模块的 copy(x) 函数,它会返回复制出来的对象
    复制对象,但是对于对象包含的成员(比如绑定到对象数据 self.value,序列中的元素),仅仅是创建一个引用,该引用指向原对象中的成员

    深拷贝:copy 的 deepcopy(x) 函数,复制对象及其成员

    列表 list

    l = [1,2,3,4]  
    l = list(iterable)
    l1+l2 # l1,l2 都必须是 list
    l1+=l2 # l2 必须是 iterable
    l1*3 # 扩展列表,实际上是复制了原列表中的元素的引用;如果原列表中的元素可变,请使用列表推导式来扩展列表
    del l[i]
    obj in l # 判断某个对象是否在这个 list 中
    

    常用方法

    append(obj):追加一个元素到末尾
    extend(seq):追加一个序列到末尾
    insert(index,obj)
    remove(obj):删除一个元素,不是根据下标哦
    pop(index):取出元素,默认取出最后一个
    clear():清空列表
    copy():浅拷贝
    index(value,[start,[stop]]):找到第一个与 value 相同的元素的下标,参数可以只有 start,没有 stop

    count(obj)
    sort([key,reverse]):对原列表排序
    reverse():对原列表反向

    元组 tuple

    t = (1,2,3)
    t = tuple(iterable)
    # 同样支持 + 和 +=,但操作符两边的变量都必须是 tuple
    # 也支持 * 和 *=
    del t # 虽然不能删除元素,但删除整个变量还是可以的
    
    # 支持的方法参考 list,当然,凡是对 tuple 做修改的,都不支持
    

    字典 dict

    d={'integer':1,'string':'hello'}
    print(d['string']) #取出的方式同 list,只不过 index 变成 key
    
    {}  # 空字典,同 dict()
    dict(a=1,b=2) # 任意数量关键字参数
    dict([['a',123]]) # 元素为二元组的序列/迭代器
    dict((i,i) for i in range(5))
    

    键不一定是字符串,也可以是数字或元组;键唯一且不可变
    创建 dict 或者扩展 dict 时,如果有同样的键,那取后一个键的值

    不支持*+操作!但是支持min()、max()、len()、del
    用d[k]为不存在key赋值时,自动创建该key并赋值,读取不存在的key的值时,抛出异常

    支持的方法

    clear()
    copy()
    pop(key[,default]):取出指定 key 的值,还可以指定一个默认 key,前面的 key 不存在就取出默认 key 的值,都不存在就抛异常
    popitem():取出一个键值对(元组形式),一般是取出最前面的一个,但是 dict 是无序的,所以无从得知会取出哪一个

    get(key, default=None):与下标取值不同的是它可以有默认值
    setdefault(key, default=None):如果字典中没有这个 key,就把这个 key 添加到字典中,值就是 default;如果 key 存在,就啥都不做
    update(dict):扩充列表

    这三个iterable支持交集并集等集合操作!集合操作后返回一个set
    values()->dict_values:返回所有值,iterable
    keys()->dict_keys:返回所有键,iterable
    items()->dict_items:用元组封装每个键值对,iterable

    dict.fromkeys(seq[, value]))->dict:静态方法,创建字典,seq 中的值为字典的键,value 为新字典的所有键的初始值
    这个字典中所有 key 的值都是同一个 value 的引用的拷贝!所以如果 value 是一个可变对象,就要小心了

    set

    set 就像是只有 key 的 dict

    s={'a','b','c'}:没有值,只有键,就是 set;也可以用 set(iterable) 函数
    d={},这是创建空的 dict,而不是空的 set

    add(obj) 同 list 的 append
    update(itertor) 同 list 的 extend()
    remove(obj) 元素不存在抛出 KeyError
    discard(obj) 效果同 remove,不过不抛异常
    pop() 无序,故不知道取出的是什么元素
    clear()

    支持集合的计算

    • 并集:set.union(s),也可以用 a|b 计算

    • 交集:set.intersection(s),也可以用 a&b 计算

    • 差集:set.difference(s),也可以用 a-b 计算

    • set.isdisjoint(s):判断两个集合是不是不相交

    • set.issuperset(s):判断集合是不是包含其他集合,等同于 a>=b

    • set.issubset(s):判断集合是不是被其他集合包含,等同于 a<=b

    列表/字典推导式

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    b = [x ** 3 for x in a if x % 2 == 0]
    # 列表推导式得到的是一个list,如果将中括号改为小括号,那得到的是一个生成器表达式,而不是一个元祖
    l=[(i,j) for i in a for j in b]
    ll=[(i,j) for i,j in zip(a,b)]
    # 上面两个是不同的,l中的元素数量是 len(a)*len(b),ll中的是 min(len(a),len(b))
    
    # 字典推导式
    # 字典不能直接迭代,必须使用 items 方法
    # 字典推导式不能换小括号变成生成器表达式
    {v: k for k, v in mcase.items()}
    

    容器类型转换

    字典转其它

    d = {'name': 'Zara', 'age': 7, 'class': 'First'}
    # 转成的字符串的数据就是 '{'name': 'Zara', 'age': 7, 'class': 'First'}'
    # 这里用切片拿前三个字符,拿到的是 '{'n'
    # list/set/tuple 也是如此
    print(str(d)[:3])
    # 下面三种方法都是可行的,只不过拿到的数据都是 key
    print(list(d))
    print(tuple(d))
    print(set(d))
    
    # 如果要拿 value 或者键值对
    print(d.keys())
    print(d.items())
    print(d.values())
    
    # 可以把拿到的 value 转成 list
    print(list(d.values()))
    

    列表/元祖/set 转其它

    l=[1,2,3,4,5,6]
    print(set(l))
    print(tuple(l))
    print(dict.fromkeys(l,'default'))
    # 如果 iterable 的每个元素都是一个包含两个元素的序列,比如 [['a',1],['b',2]]
    # 可以直接用 dict(iterable) 转成字典
    
    # 直接 join 是不行的,必须把所有元素都转成 str
    print(''.join(str(_) for _ in l))
    

    字符串转其它

    s='hello'
    print(set(s))
    print(list(s))
    print(tuple(s))
    print(dict.fromkeys(s,'default'))
    

    相关文章

      网友评论

          本文标题:python笔记(六)数据类型 - 内置序列与字典

          本文链接:https://www.haomeiwen.com/subject/tooahqtx.html