美文网首页
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笔记(六)数据类型 - 内置序列与字典

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

  • 集合

    一、什么是集合 Python语言提供的内置数据结构 与列表、字典一样,都属于可变序列 集合是没有Value的字典 ...

  • day 8集合、函数基操

    1.字典(dict) 1.什么是字典(dict) 字典是python内置的容器类的数据类型,可变,无序的。****...

  • Python操作列表、字典、元组

    说明:Python内置的数据类型有:列表(list)、字典(dictionary)、元组(tuple)、字符串(s...

  • python学习_day8

    高级数据类型 序列:在python中,序列就是一组按照顺序排列的值【数据集合】 在python中存在三种内置的序列...

  • 六、 python中的数据类型——字典

    字典(dict) 字典是python内置的一种数据类型,使用键-值(key-value)进行存储,查找速度极快。字...

  • Python - 基本数据类型

    学习资料 Python之旅 相关链接 Python 基础 笔记 常用数据类型 序列(suquence): Pyth...

  • 序列化

    在 Python 中 pickle 模块实现对数据的序列化和反序列化。pickle 支持任何数据类型,包括内置数据...

  • python基础教程:dict(字典)

    字典(dict, dictionary的简写)是Python中另一个非常重要的内置数据类型,是Python中映射类...

  • 01.03 笔记-字典

    字典 什么是字典 python提供的容器型数据类型,可变并且无序的序列 可变 - 支持增删改 无序 - 不支持查,...

网友评论

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

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