字典和集合

1148-张同学

发表文章数:63

热门标签

,
首页 » Python » 正文

字典

“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含“键对象”和“值对象”。
“键”是任意不可变数据,比如:整数、浮点数、字符串、元组,但是列表、字典、集合这些可变对象不可作为“键”,并且“键”不可以重复。
“值”可以为任意的数据,并可以重复。

字典的创建

字典有三种创建方式,{}和dict()、zip、fromkeys,其中第一种为重点。

// 字典的创建
#{}和dict()
>>> a={"name":"一个小白的日常","age":24,"job":"student"}
>>> a
{'name': '一个小白的日常', 'age': 24, 'job': 'student'}
>>> a=dict(name="一个小白的日常",age=18,job="student")
>>> a
{'name': '一个小白的日常', 'age': 18, 'job': 'student'}
>>> a=dict([("name","一个小白的日常"),("age",24),("job","student")])
>>> a
{'name': '一个小白的日常', 'age': 24, 'job': 'student'}
#zip
>>> key=['name','age','job']
>>> key
['name', 'age', 'job']
>>> value=['一个小白的日常',24,'student']
>>> value
['一个小白的日常', 24, 'student']
>>> d=dict(zip(key,value))
>>> d
{'name': '一个小白的日常', 'age': 24, 'job': 'student'}
#fromkeys 创建值为空的字典
>>> a=dict.fromkeys(['name','age','job'])
>>> a
{'name': None, 'age': None, 'job': None}
字典元素的访问

元素的访问有五种,实现对键和值进行整体访问和分别访问。

//  元素的访问
#通过“键”获得“值”,若键不存在,则抛出异常
>>> a=dict([("name","一个小白的日常"),("age",24),("job","student")])
>>> a
{'name': '一个小白的日常', 'age': 24, 'job': 'student'}
>>> a['name']
'一个小白的日常'
>>> a['sex']
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    a['sex']
KeyError: 'sex'
#get() 通过“键”获得“值”,如键不存在,返回None或者默认返回对象
>>> a.get('name')
'一个小白的日常'
>>> a.get('sex')

>>> a.get('sex','不知道')
'不知道'
#列出所有的键值对
>>> a.items()
dict_items([('name', '一个小白的日常'), ('age', 24), ('job', 'student')])
#列出所有的键  或   值
>>> a.keys()
dict_keys(['name', 'age', 'job'])
>>> a.values()
dict_values(['一个小白的日常', 24, 'student'])
#检测“键”是否在字典中
>>> 'name' in a
True
>>> 'sex' in a
False
字典元素的添加、修改、删除

字典元素的添加
给字典添加“键值对”,若“键”已存在,则覆盖旧的“键”,没有则进行添加。

// 添加
>>> a['address']='河北'
>>> 
>>> a
{'name': '一个小白的日常', 'age': 24, 'job': 'student', 'address': '河北'}

字典元素的修改
将新字典中所有的“键值对”全部添加到旧字典对象上,若key有重复,则直接覆盖。

// 修改
>>> a={"name":"一个小白的日常","age":24,"job":"student"}
>>> a
{'name': '一个小白的日常', 'age': 24, 'job': 'student'}
>>> b={'name':'一个小可爱的日常','age':18,"job":"student",'money':'穷'}
>>> b
{'name': '一个小可爱的日常', 'age': 18, 'job': 'student', 'money': '穷'}
>>> a.update(b)
>>> a
{'name': '一个小可爱的日常', 'age': 18, 'job': 'student', 'money': '穷'}

字典元素的删除
元素的删除有四种方式,del()、clear()、pop()、popitem()

// 删除
#del()
>>> a={'name': '一个小可爱的日常', 'age': 18, 'job': 'student', 'money': '穷'}
>>> a
{'name': '一个小可爱的日常', 'age': 18, 'job': 'student', 'money': '穷'}
>>> del(a['name'])
>>> a
{'age': 18, 'job': 'student', 'money': '穷'}
#clear()
>>> a.clear()
>>> a
{}
#pop()  删除指定的键,并返回对应的值
>>> a.pop('name')
'一个小可爱的日常'
>>> a
{'age': 18, 'job': 'student', 'money': '穷'}
#popitem() 从最后一个元素开始删除
>>> a=dict([("name","一个小白的日常"),("age",24),("job","student")])
>>> a
{'name': '一个小白的日常', 'age': 24, 'job': 'student'}
>>> a.popitem()
('job', 'student')
>>> a
{'name': '一个小白的日常', 'age': 24}

序列解包

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

// An highlighted block
#对“键”进行操作
>>> a=dict([("name","一个小白的日常"),("age",24),("job","student")])
>>>> a
{'name': '一个小白的日常', 'age': 24, 'job': 'student'}
>>> i,j,k=a
>>> i
'name'
>>> j
'age'
>>> k
'job'
#对“键值对”进行操作
>>> i,j,k=a.items()
>>> i
('name', '一个小白的日常')
>>> j
('age', 24)
>>> k
('job', 'student')
#对“值”进行操作
>>> i,j,k=a.values()
>>> i
'一个小白的日常'
>>> j
24
>>> k
'student'

重点练习题:表格数据使用字典和列表存储,并实现访问

字典和集合
分别使用字典和列表存储,并实现访问
使用字典存储,并实现访问

// 字典
dict1={'name':'闺蜜一号','age':26,'job':'前端测试','city':'常州'}
dict2={'name':'闺蜜二号','age':23,'job':'教师','city':'石家庄'}
dict3={'name':'闺蜜三号','age':24,'job':'医生','city':'邢台'}

D=[dict1,dict2,dict3]

#获取第二行人的职业
print(D[1].get('city'))

#打印表中所有的职业
for i in range(len(D)):
    print(D[i].get('city'))
    
#打印表中所有的数据
for i in range(len(D)):
    print(D[i].get('name'),D[i].get('age'),D[i].get('job'),D[i].get('city'))

字典和集合
使用列表存储,并实现访问

// 列表
list1=['name:闺蜜一号','age:26','job:前端测试','city:常州']
list2=['name:闺蜜二号','age:23','job:教师','city:石家庄']
list3=['name:闺蜜三号','age:24','job:医生','city:邢台']

D=[list1,list2,list3]

#对于D[1][2],其中第一个[1]可以理解为list中的list2,第二个[2]可以理解为list2中的内容"job",这一部分可以参考多维列表(python的第三天(列表与元组))。

#获取第二行人的职业
print(D[1][2])

#打印表中所有的职业
for i in range(len(D)):
    print(D[i][2])
    
#打印表中所有的数据
for i in range(len(D)):
    for j in range(len(list1)):
        print(D[i][j])

字典和集合

了解:字典核心底层原理(存储和读取操作)

字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫 bucket,每个bucket有两个部分:一个是键对象的引用,一个是值对象的引用。
由于bucket的结构和大小一致,通过偏移量读取指定bucket。
每个键对应着唯一的索引,进行存储
字典和集合
通过计算“键”的散列值寻找对应的索引

// 
#假设字典a对象创建完后的数组长度为8
>>> a={}
>>> a['name']='一个小白的日常'
>>> a
{'name': '一个小白的日常'}
#将'name'='一个小白的日常'这个键值放到字典对象a中,需要使用hash()计算'name'的散列值
>>> bin(hash('name'))
'0b1111000100000000101001100011001011111101000100010011011001010'

由于之前假设散数组长度为8,可以计算出散列值最右边的三位数字作为偏移量,寻找对应索引。计算出来的散列值是二进制,需要转化为十进制。
字典和集合
通过计算最右边的三位数字,因此可以将键值存储到2中。值得注意的是如果2已有存储值,则向左移三位,再次计算索引。如果还是无法找到,则将数组扩容到16位、32位,重新从最右边的四位或者更多位数字计算(这里的最右边的位数是根据扩容的数组长度决定的,16=0b1111,32=0b11111)
*当计算的数字接近散列值的三分之二时,数组会自动进行扩容。
字典读取操作
通过计算散列值,找到索引的对应位置,寻找过程与“上边的步骤”相同,然后将“键”值取出,计算它的散列值。若相同,则说明读取的值是正确的。

集合

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

集合的创建、删除
// 集合的创建
#{}创建,使用add()添加元素
>>> a={15,20,'一个小白的日常'}
>>> a
{20, '一个小白的日常', 15}
>>> type(a)
<class 'set'>
>>> a.add(30)
>>> a
{20, '一个小白的日常', 30, 15}
#使用set()将列表、元组转化为集合
>>> a=[20,30,50,70]
>>> a
[20, 30, 50, 70]
<class 'list'>
>>> b=set(a)
>>> b
{70, 50, 20, 30}
>>> type(b)
<class 'set'>
// 集合的删除
#remove()删除指定的元素
>>> a={15,20,'一个小白的日常'}
>>> a
{20, '一个小白的日常', 15}
>>> type(a)
<class 'set'>
>>> a.remove(15)
>>> a
{20, '一个小白的日常'}
#clear()删除所有元素
>>> a.clear()
>>> a
set()
集合的相关操作:并集、交集、差集等
// 两个集合的操作
>>> a={15,20,'一个小白的日常'}
>>> a
{20, '一个小白的日常', 15}
>>> b={30,70,90,'一个小白的日常'}
>>> b
{70, 90, '一个小白的日常', 30}
#并集
>>> a|b
{20, 70, 90, '一个小白的日常', 30, 15}
>>> a.union(b)
{20, 70, 90, '一个小白的日常', 30, 15}
#交集
>>> a&b
{'一个小白的日常'}
>>> a.intersection(b)
{'一个小白的日常'}
#差集
>>> a-b
{20, 15}
>>> a.difference(b)
{20, 15}

未经允许不得转载:作者:1148-张同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《字典和集合》 发布于2020-06-23

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录