牛骨文教育服务平台(让学习变的简单)

python3入门之字典

获得更多资料欢迎进入我的网站或者 csdn或者博客园

本节主要介绍字典,字典也成映射,时python中唯一内建的映射类型。更多详细请点击readmore。下面附有之前的文章;

字典的介绍与作用

在元组和列表中,都是通过编号进行元素的访问,但有的时候我们按名字进行数据甚至数据结构的访问,在c++和java中有map的概念,也就是映射。同样在python中也提供了内置的映射类型–字典。映射其实就是一组键(key)和值(value)以及之间的映射函数。键可以是数字、字符串甚至是元组。
字典类型与序列类型的区别:
1.存取和访问数据的方式不同。
2.序列类型只用数字类型的键(从序列的开始按数值顺序索引);
3.映射类型可以用其他对象类型作键(如:数字、字符串、元祖,一般用字符串作键),和序列类型的键不同.
4.映射类型的键直接或间接地和存储数据值相关联。
5.映射类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。
6.映射类型用键直接“映射”到值。

创建字典

简单地说字典就是用大括号包裹的键值对的集合。
1可以通过一下方式创建:
字典由多个键及与其对应的值构成的对组成。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来。
字典中的键必须是唯一的,而值可以不唯一。

>>> student_id={"peace":"201421014960","nick_peace":"201421014970","nicl_peace2":"201421014980"}
>>> student_id
{"peace": "201421014960", "nicl_peace2": "201421014980", "nick_peace": "201421014970"}
>>> student_id["peace"]
"201421014960"

2可以通过dict函数创建
用 dict 函数,通过其他映射(比如其他字典)或者(键,值)这样的序列对建立字典。

#通过序列创建
>>> items=[("peace","201421014960"),("nick_peace","201421014970")]
>>> student_id=dict(items)
>>> student_id["nick_peace"]
"201421014970"
>>> 
#也可以通过关键字参数来创建
>>> student_id=dict(peace="201421014960",age=23)
>>> student_id
{"age": 23, "peace": "201421014960"}
>>> 

字典基本操作

字典的基本行为在很多方面与序列类似:

(1)len(d) 返回 d 中项(键-值对)的数量
(2)d[k] 返回关联到键 k 上的值
(3)d[k] = v 将值 v 关联到键 k 上
(4)del d[k] 删除键为 k 的项
(5)k in d 检查 d 中是否有含有键为 k 的项

>>> student_id={"peace":"201421014960","nick_peace":"201421014970","nicl_peace2":"201421014980"}
>>> len(student_id)
3
>>> student_id["nick_peace"]
"201421014970"
>>> student_id["nick_peace"]=2014
>>> student_id
{"peace": "201421014960", "nicl_peace2": "201421014980", "nick_peace": 2014}
>>> del student_id["nick_peace"]
>>> student_id
{"peace": "201421014960", "nicl_peace2": "201421014980"}
>>> "peace" in student_id
True
>>> "nick_peace" in student_id
False

注意:

尽管字典和列表有很多特性相同,但也有下面一些重要的区别。
(1)键类型:字典的键不一定为整型数据(但也可能是),也可能是其他不可变类型,比如浮点型(实型)、字符串或者元组。
(2)自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。
(3)成员资格:表达式 k in d (d 为字典) 查找的是键,而不是值。
例如:

>>> item=[]
>>> item[1]=23
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> item={}
>>> item[1]=23
>>> item
{1: 23}
>>> 

字典的格式化字符串

在每个转换(conversion specifier)中的 % 字符后面,可以加上用圆括号括起来的键,后面再跟上其他说明元素。

>>> student_id={"peace":"201421014960","nick_peace":"201421014970","nicl_peace2":"201421014980"}
>>> "peace"s student id is %(peace)s." % student_id
"peace"s student id is 201421014960."
>>> 

只要所有给出的键都能在字典中找到,就可以获得任意数量的转换说明符。这类字符串格式化在模板系统中非常有用:

>>> template = """<html> 
... ... <head><title>%(title)s</title></head> 
... ... <body> 
... ... <h1>%(title)s</h1> 
... ... <p>%(text)s</p> 
... ... </body>"""
>>> data = {"title":"My Home Page", "text":"Welcome to my home page!"} 
>>> print(template % data)  
<html> 
... <head><title>My Home Page</title></head> 
... <body> 
... <h1>My Home Page</h1> 
... <p>Welcome to my home page!</p> 
... </body>
>>> 

字典方法

就像其他内建类型一样,字典也有方法,这些方法非常有用;下面对一些方法进行讲解

clear方法

clear 方法清除字典中所有的项。这是个原地操作,所以无返回值(或者说返回 None)。

>>> student_id={"peace":"201421014960","nick_peace":"201421014970","nicl_peace2":"201421014980"}
>>> student_id.clear()
>>> student_id
{}
>>> 

copy方法

copy 方法返回一个具有相同键-值对的新字典(这个方法实现的是浅复制(shallow copy),因为值本身就是相同的,而不是副本)。

>>> student_id={"peace":"201421014960","nick_peace":"201421014970","pp":["p1","p2","p3"]}
>>> stucopy=student_id.copy()
>>> stucopy["peace"]="22222"
>>> stucopy["pp"].remove("p2")
>>> stucopy
{"peace": "22222", "nick_peace": "201421014970", "pp": ["p1", "p3"]}
>>> student_id
{"peace": "201421014960", "pp": ["p1", "p3"], "nick_peace": "201421014970"}
>>> 

上面,当在 y 中替换值的时候,x 不受影响,但是,如果修改了某个值(原地修改,而不是替换),x 也会改变,因为同样的值也存储在原字典中。
避免这个问题的一种方法就是使用深复制( deep copy),复制其包含所有的值。可以使用 copy 模块的 deepcopy 函数来完成操作。

>>> from copy import deepcopy
>>> student_id={"peace":"201421014960","nick_peace":"201421014970","pp":["p1","p2","p3"]}
>>> stucopy=deepcopy(student_id)
>>> stucopy["peace"]="22222"
>>> stucopy["pp"].remove("p2")
>>> stucopy
{"peace": "22222", "nick_peace": "201421014970", "pp": ["p1", "p3"]}
>>> student_id
{"peace": "201421014960", "pp": ["p1", "p2", "p3"], "nick_peace": "201421014970"}

fromkeys方法

fromkeys 方法使用给定的键建立新的字典,每个键默认对应的值为 None。

#空字典建立
>>> {}.fromkeys(["peace","nixk"])
{"peace": None, "nixk": None}
#直接在所有字典的类型 dict 上面调用方法
>>> dict.fromkeys(["peace","nixk"])
{"peace": None, "nixk": None}
#不想使用None作为默认值,也可以自己提供默认值。
>>> dict.fromkeys(["peace","nixk"],"(handsome)")
{"peace": "(handsome)", "nixk": "(handsome)"}

get方法

get方法和的d[key]类似

#当使用 get 访问一个不存在的键时,没有任何异常,而得到了 None 值。
>>> student_id
{"peace": "201421014960", "pp": ["p1", "p2", "p3"], "nick_peace": "201421014970"}
>>> print(student_id["pp"])
["p1", "p2", "p3"]
>>> print(student_id["pp1"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "pp1"
>>> print(student_id.get("pp1"))
None
#可以定义“默认”返回值,替换 None:
>>> print(student_id.get("pp1","N/A"))
N/A
#如果键存在,get用起来就像普通的字典查询一样。
>>> print(student_id.get("pp","N/A"))
["p1", "p2", "p3"]
>>> 

items方法

items 方法将所有的字典项以dict_items 方式返回,这些列表项中的每一项都来自于(键,值)

>>> student_id
{"peace": "201421014960", "pp": ["p1", "p2", "p3"], "nick_peace": "201421014970"}
>>> student_id.items()
dict_items([("peace", "201421014960"), ("pp", ["p1", "p2", "p3"]), ("nick_peace", "201421014970")])

keys方法

keys 方法将字典中的键以 dict_keys 形式返回。

>>> student_id
{"peace": "201421014960", "pp": ["p1", "p2", "p3"], "nick_peace": "201421014970"}
>>> student_id.keys()
dict_keys(["peace", "pp", "nick_peace"])
>>> 

pop方法和popitem

pop 方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除。

>>> student_id
{"peace": "201421014960", "pp": ["p1", "p2", "p3"], "nick_peace": "201421014970"}
>>> student_id.pop("peace")
"201421014960"
>>> student_id
{"pp": ["p1", "p2", "p3"], "nick_peace": "201421014970"}
>>> 

popitem 弹出随机的项和将这个键-值对从字典中移除。

>>> student_id
{"pp": ["p1", "p2", "p3"], "nick_peace": "201421014970"}
>>> student_id.popitem()
("pp", ["p1", "p2", "p3"])
>>> student_id.popitem()
("nick_peace", "201421014970")
>>> student_id
{}
>>> 

setdefaut方法

setdefault 方法在某种程度上类似于 get 方法,就是能够获得与给定键相关联的值,除此之外,setdefault 还能在字典中不含有给定键的情况下设定相应的键值。当键不存在的时候,setdefault 返回默认值并且相应地更新字典。如果键存在,那么就返回与其相应的值,但不改变字典。

>>> d = {}
>>> d.setdefault("name", "N/A")
"N/A"
>>> d
{"name": "N/A"}
>>> d["name"] = "Gumby"
>>> d.setdefault("name", "N/A")
"Gumby"
>>> d
{"name": "Gumby"}

update方法

update 方法可以利用一个字典项更新另一个字典。

>>> d={"peace":"2222222","pp":111}
>>> x={"peace":"201421014960"}
>>> d.update(x)
>>> d
{"peace": "201421014960", "pp": 111}
>>> 

value方法

values 方法以 dict_values 的形式返回字典中的值。

>>> d
{"peace": "201421014960", "pp": 111}
>>> d.values()
dict_values(["201421014960", 111])
>>> 

字典的遍历

遍历字典的值

for value in adict.values():

>>> d
{"1": 2, "3": 4, "5": 6}
>>> for i in d.values():print(str(i)) 
... 
2
4
6
>>> 

遍历字典的键

for key in adict.keys():

>>> d
{"1": 2, "3": 4, "5": 6}
>>> for i in d:print(str(i)) 
... 
1
3
5
>>> for i in d.keys():print(str(i)) 
... 
1
3
5
>>> 

遍历字典的项

for item,value in adict.items():

>>> d
{"1": 2, "3": 4, "5": 6}
>>> for key,values in d.items():print(str(key)+","+str(values))
... 
1,2
3,4
5,6
>>> 

字典就讲到这里;

相关链接:

python3入门之类
python3入门之函数
python3入门之循环
python3之if语句
python3入门之赋值语句介绍
python3入门之print,import,input介绍
python3入门之set
python3入门之字典
python3入门之字符串
python3入门之列表和元组
python3入门之软件安装
python3爬虫之入门和正则表达式