导语:本文章记录了本人在学习Python基础之数据结构篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。
本文重点:
1、掌握常见的字典创建,查询,判别方法;
2、了解字典中的defaultdict、子类化Userdict和常见映射类型;
3、了解支撑字典和集合背后的散列表的工作原理。
一、常见的字典方法
1、创建方法
分为字面量句法和构造方法两种,下面以{"one":1,"two":2,"three":3}为例
d1={"one":1,"two":2,"three":3}#字面量句法
d2=dict(one=1,two=2,three=3)
d3=dict([("one",1),("two",2),("three",3)])
d4=dict({"one":1,"two":2,"three":3})
d5=dict(zip(["one","two","three"],[1,2,3]))#zip并行解包
print(d1==d2==d3==d4==d5)#True
以上五种方法创建的字典是相等的。
2、isintance
映射类型(Mapping Types)是一种关联式的容器类型,它存储了对象与对象之间的映射关系。
字典是Python中唯一的映射类型,它是存储了若干键值对(由键映射到值)的关联容器。
collections.abc模块中有两个抽象基类,分别是Mapping和MutableMapping,它们为dict和其他类似的类型定义形式接口。
isinstance:判定object的类型
语法:isinstance(object, classinfo)
其中,object 是变量,classinfo 是类型即 (tuple,dict,int,float,list,bool等) 和 class类
若参数object是classinfo类的实例,或者object是classinfo类的子类的一个实例, 返回 True;若 object 不是一个给定类型的的对象,则返回结果总是False。
若classinfo不是一种数据类型或者由数据类型构成的元组,将引发一个TypeError 异常。
eg:
from _collections_abc import Mapping
my_dict={}
print(isinstance(my_dict,Mapping))#判断数据是否为广义映射类型。输出True.
isinstance和type的区别:
若对象是classinfo中一个类的子类,isinstance可以判断出来返回True,而type是不能的。
3、字典推导
字典推导:在{}中使用命令语句加for甚至if实现迭代推导出新列表的操作。
Country_Codes=[(86,"China"),(91,"India"),(1,"United States"),(62,"Indonesia"),(55,"Brazil"),(92,"Pakistan"),(81,"Japan")]
dict1={country:code for code,country in Country_Codes}#推导过程
print(dict1)
dict2={code:country.upper() for code,country in Country_Codes if code>80}#由限制要求创建字典
print(dict2)
#输出:
{'China': 86, 'India': 91, 'United States': 1, 'Indonesia': 62, 'Brazil': 55, 'Pakistan': 92, 'Japan': 81}
{86: 'CHINA', 91: 'INDIA', 92: 'PAKISTAN', 81: 'JAPAN'}
4、setdefault:处理找不到的键
d.setdefault VS d.get
d.setdefault(k,[default])和d.get(k,[default])两种方法都可以处理找不到的键的情况,区别在于setdefault在返回默认值的同时能够在原字典创建新的k-default键值对。
所以更新某个键值对但键不一定存在时,用d.setdefault更好一些.
eg1:处理找不到的键
names=["Ailee","