python基础03字典和集合

1 字典

“键”是任意的不可变数据,比如:整数、浮点数、字符串、元组。但是:列表、字典、集合这些可变对象,不能作为“键”。并且“键”不可重复

1.1 创建

1 {}dict()
a = {"name":"xx","age":18}
b = dict(name="xx",age = 18)
c = dict([("name","gaoqi"),("age",18)])

2 zip()
k = ["name","age"]
v = ["xx",18]
d = dict(zip(k,v))

3 fromkeys创建空字典
a = dict.fromkeys(["age","name"])

1.2 访问

1 通过键来访问
a['name']

2 get方法,若键不存在,返回None,或者自己制定返回什么
a.get('name')
a.get('n','不存在该键')

3 列出所有键值对
a.items()

4 列出所有键,列出所有值
a.keys()
a.values()

5 len()
键值对个数

6 检测一个‘键’是否在字典中
name in a

1.3 元素添加、修改、删除

1 新增键值对

若键存在则覆盖旧的键值对,若不存在,则新增键值对
a['Sex'] = 0

update()将将新字典中所有键值对全部添加到旧字典对象上。如果 key 有重复,则直接覆盖
>>> a ={'name':'gaoqi','age':18,'job':'programmer'}
>>> b = {'name':'gaoxixi','money':1000,'sex':'男的'}
>>> a.update(b)
{'name': 'gaoxixi', 'age': 18, 'job': 'programmer', 'money': 1000, 'sex': '男的'}

2 删除

删除a中的name键值对:del(a['name')
清空字典:a.clear()
删除指定键值对,并返回对应的“值对象”:a.pop('name')
随机删除和返回该键值对:a.popitem()
字典是“无序可变序列”,
因此没有第一个元素、最后一个元素的概念,
popitem 弹出随机的项

1.4 序列解包

用于元组、列表、字典,可对多个变量赋值

>>>a,b,c = (10,20,30)
>>>a
20
>>>b
30

用于字典时,默认对键进行操作,如需获得键值对可用items(),如需获得值可用values();

>>>s = {'name':'gaoqi','age':18,'job':'teacher'}
>>>name,age,job = s
>>>name
gaoqi
>>>name,age,job = s.items()
>>>name
('name', 'gaoqi')
>>>name,age,job = s.values()
>>>name
'gaoqi'

1.5 案例:表格数据用字典和列表存储

在设计这题的代码时,考虑{}里包含[]还是[]里包含{}

r1 = {"name":"高小一","age":18,"salary":30000,"city":"北京"}
r2 = {"name":"高小二","age":19,"salary":20000,"city":"上海"}
r3 = {"name":"高小五","age":20,"salary":10000,"city":"深圳"}
tb = [r1,r2,r3]

访问所有数据:
for i in range(len(tb)):
	print(tb[i].get("name"),tb[i].get("age"),tb[i].get("salary"),tb[i].get("city"))

1.7 字典底层原理

字典对象的核心是散列表,散列表是一个稀疏数组(总有空白元素的数组),数组的每个单元叫做bucket,每个bucket有两个部分:一个是键对象的引用、一个是值对象的引用。因所有bucket结构和大小一致,可通过偏移量来读取指定的bucket。
将一个键值对放入字典的底层过程:
在这里插入图片描述
当散列表中的容量接近2/3时,列表会进行扩容,即创造一个更大的数组,将原有内容拷贝到新的数组中

根据键查找对的底层过程
在这里插入图片描述
用法总结:

  1. 键必须可散列
    (1) 数字、字符串、元组,都是可散列的。
    (2) 自定义对象需要支持下面三点:
    1 支持 hash()函数
    2 支持通过__eq__()方法检测相等性。
    3 若 a==b 为真,则 hash(a)==hash(b)也为真。
  2. 字典在内存中开销巨大,典型的空间换时间。
  3. 键查询速度很快
  4. 往字典里面添加新建可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字
    典的同时进行字典的修改。便利和修改要分开

2 集合

集合是无序可变,元素不能重复,集合底层是字典实现,集合的所有元素都是字典中的键对象,因此不能重复且唯一

2.1 创建和删除

1 {}创建集合对象,使用add()方法添加元素
>>> a = {3,5,7}
>>> a
{3, 5, 7}
>>> a.add(9)
>>> a
{9, 3, 5, 7}

2 使用set(),将列表、元组等可迭代对象转换成集合,如果原数据存在重复,则保留一个
>>>a = [1,1,2,4]
>>>b = set(a)
>>>b
{1, 2, 4}

3 remove()删除指定原色;clear()清空整个集合
>>> a = {10,20,30,40,50}
>>> a.remove(20)
>>> a
{10, 50, 30}

2.2 集合相关操作

>>> a = {1,3,'sxt'}
>>> b = {'he','it','sxt'}
>>> a|b #并集
{1, 3, 'sxt', 'he', 'it'}
>>> a&b #交集
{'sxt'}
>>> a-b #差集
{1, 3}
>>> a.union(b) #并集
{1, 3, 'sxt', 'he', 'it'}
>>> a.intersection(b) #交集
{'sxt'}
>>> a.difference(b) #差集
{1, 3}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值