7.字典
来源:互联网 发布:淘宝怎样设置运费模板 编辑:程序博客网 时间:2024/06/08 04:59
----------------字典----------------
(1)首先,解释一下何为映射?
一种通过名字来引用值的数据结构,我们称之为映射。
而字典是Python中唯一内建的映射类型。字典中的值没有特殊的顺序,但是都存储在一个特定的键(key)下。键可以是数字、字符串甚至是元组。
(2)创建和使用字典
(2.1)创建字典
—{}
如:phonebook={"Alice": "2341", "Beth": "9102", "Cecil": "3258"}
—dict函数
可以用dict函数,通过其他映射或者对的序列建立字典。
—直接使用key访问:key不存在会报错,可以使用in和not in判断。
—循环遍历:
例:
(2.3)基本字典操作
字典的基本行为在很多方面与序列类似:
※len(d)返回d中项(键-值对)的数量;
※d[k]返回关联在键k上的值;
※d[k]=v将值v关联到键k上;
※del d[k]删除键为k的项;
□键类型:字典的键不一定为整型数据(但也可以是),键可以是任意的不可变类型,比如浮点型(实型)、字符串或元组。
□自动添加:即使键起初在字典中并不存在,也可以为它赋值,这样字典就可以建立新的项。而列表(在不使用append方法或其他类似操作的情况下)不能将值关联到列表 范围之外的索引上。
□成员资格:表达式k in d(d为字典)查找的是键,而不是值。表达式v in l(l为列表)则用来查找值,而不是索引。
(3)字典方法
1.clear
clear方法清除字典中所有的项。这个是原地操作,无返回值。
fromkeys方法用给定的键建立新的字典,每个键对应一个默认的值None。
如果不想使用None作为默认值,也可以自己提供默认值。
get方法是个更宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会出错:
pop方法用来获得给定键的值,然后将这个键值对从字典中移除。
items方法将字典所有的项以列表方式返回,列表中的每一项都表示为(键,值)对的形式,但是项在返回时并没有遵循特定的次序。
keys方法将字典中的键以列表形式返回。
values方法将字典中的值以列表形式返回。
update方法可以利用一个字典更新另外一个字典。
copy方法返回的是具有相同键值对的新字典,需要注意的是:这个方法实现的是浅拷贝!与此对应的是深拷贝!
二者的区别,如下:
【例1】
因此,修改原始字典的某一项时,不影响拷贝字典。
明白了这一点之后,我们再看一个例子。
【例2】
浅拷贝:只拷贝父对象,不会拷贝对象内部的子对象。
深拷贝:拷贝父对象及其子对象。
也就是说,
※当你改变原始字典一级目录下(父级)的对象时,不会对拷贝字典产生任何影响。
因为 原始字典与拷贝字典彼此独立占用内存空间!
当你改变原始字典子目录下的对象时,对浅拷贝字典产生直接影响,不影响深拷贝。
因为 浅拷贝只拷贝父对象,不会拷贝对象内部的子对象,所以浅拷贝的子对象与原始字典保持一致!
而深拷贝由于拷贝父对象及其子对象,所以对它而言,任何对原始字典的修改都与它无关!
【例3】(不解释,检查一下你理解“深拷贝”与“浅拷贝”了吗?)
----------------各种推导式----------------
推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种
(1)列表推导式。
功能:一种方便的列表创建方法,
格式:用中括号括起来,中间用for语句,后面跟if语句用作判读,满足条件的传到for语句前面用作构建先的列表
例:
(2)字典推导式。
格式:跟列表推导式的用法差不多,只是不中括号改成大括号。
例:#快速交换字典 键—值
(3)集合推导式。
功能:跟列表推导式差不多,都是对一个序列的元素全部执行相同的操作,但集合是一种无序的序列。
格式:1.不使用中括号,使用大括号;
2.结果中无重复;
3.结果是一个set()集合,集合里面是一个序列。
例:
(1)首先,解释一下何为映射?
一种通过名字来引用值的数据结构,我们称之为映射。
而字典是Python中唯一内建的映射类型。字典中的值没有特殊的顺序,但是都存储在一个特定的键(key)下。键可以是数字、字符串甚至是元组。
(2)创建和使用字典
(2.1)创建字典
—{}
如:phonebook={"Alice": "2341", "Beth": "9102", "Cecil": "3258"}
—dict函数
可以用dict函数,通过其他映射或者对的序列建立字典。
>>>items = [("name","Gumby"),("age",42)] >>>d = dict(items) >>>d {"age":42,"name":"Gumby"}如果不带任何参数,dict函数返回一个空字典
>>>dict() {}(2.2)访问字典
—直接使用key访问:key不存在会报错,可以使用in和not in判断。
—循环遍历:
例:
>>>dic1={"name":"milo","gender":"male","age":25} >>>for k in dic1: print(k) name gender age—使用迭代器:for key in dict1
(2.3)基本字典操作
字典的基本行为在很多方面与序列类似:
※len(d)返回d中项(键-值对)的数量;
※d[k]返回关联在键k上的值;
※d[k]=v将值v关联到键k上;
※del d[k]删除键为k的项;
※k in d检查d中是否含有键为k的项。
□键类型:字典的键不一定为整型数据(但也可以是),键可以是任意的不可变类型,比如浮点型(实型)、字符串或元组。
□自动添加:即使键起初在字典中并不存在,也可以为它赋值,这样字典就可以建立新的项。而列表(在不使用append方法或其他类似操作的情况下)不能将值关联到列表 范围之外的索引上。
□成员资格:表达式k in d(d为字典)查找的是键,而不是值。表达式v in l(l为列表)则用来查找值,而不是索引。
(3)字典方法
1.clear
clear方法清除字典中所有的项。这个是原地操作,无返回值。
>>> dic1={"name":"milo","age":25,"tel":"2584"} >>> dic1 {'age': 25, 'tel': '2584', 'name': 'milo'} >>> dic1.clear() >>> dic1 {}2.fromkeys
fromkeys方法用给定的键建立新的字典,每个键对应一个默认的值None。
>>> dic1 {} >>> dic1.fromkeys(["name","gender","address","ID","tel"]) {'tel': None, 'address': None, 'ID': None, 'gender': None, 'name': None
如果不想使用None作为默认值,也可以自己提供默认值。
>>> {}.fromkeys(["name","gender","address"],("unknow")) {'address': 'unknow', 'gender': 'unknow', 'name': 'unknow'}3.get
get方法是个更宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会出错:
>>> dic1={"name":"milo","age":25,"tel":"2584"} >>> dic1 {'age': 25, 'tel': '2584', 'name': 'milo'} >>> dic1["gender"] Traceback (most recent call last): File "<pyshell#13>", line 1, in <module> dic1["gender"] KeyError: 'gender'而用get就不会:
>>> print(dic1.get("gender")) None可以看到,当使用get访问一个不存在的键时,没有任何异常,而得到了None值。还可以自定义“默认”值,替换None:
>>> dic1 {'age': 25, 'tel': '2584', 'name': 'milo'} >>> dic1.get("address") >>> print(dic1.get("address")) None >>> print(dic1.get("gender","no")) no如果键存在,get用起来与普通的字典查询一样:
>>> dic1.get("name") 'milo'4.pop
pop方法用来获得给定键的值,然后将这个键值对从字典中移除。
>>> x={'machine': ['bee', 'bar', 'baz'], 'username': 'mlh'} >>> x.pop("machine") ['bee', 'bar', 'baz'] >>> x {'username': 'mlh'}5.items
items方法将字典所有的项以列表方式返回,列表中的每一项都表示为(键,值)对的形式,但是项在返回时并没有遵循特定的次序。
>>> d={ "title":"Python Web Site", "url":"http://www.python.org", "spam":0 } >>> d.items() dict_items([('spam', 0), ('url', 'http://www.python.org'), ('title', 'Python Web Site')])6.keys
keys方法将字典中的键以列表形式返回。
>>> d={ "title":"Python Web Site", "url":"http://www.python.org", "spam":0 } >>> d.keys() dict_keys(['spam', 'url', 'title'])7.values
values方法将字典中的值以列表形式返回。
>>> d={ "title":"Python Web Site", "url":"http://www.python.org", "spam":0 } >>> d.values() dict_values([0, 'http://www.python.org', 'Python Web Site'])8.update
update方法可以利用一个字典更新另外一个字典。
>>> d={"title":"Python Web Site","url":"http://www.python.org","changed":"Mar 14 22:09:15 MET 2008" } >>> x={"title":"Python Language Website","spam":0} >>> d.update(x) >>> d {'url': 'http://www.python.org', 'title': 'Python Language Website', 'spam': 0, 'changed': 'Mar 14 22:09:15 MET 2008'}9.copy
copy方法返回的是具有相同键值对的新字典,需要注意的是:这个方法实现的是浅拷贝!与此对应的是深拷贝!
二者的区别,如下:
【例1】
>>> from copy import deepcopy >>> d={"name":"milo","gender":"male","age":25} #d:原始字典 >>> c=d.copy() #c:浅拷贝 >>> dc=deepcopy(d) #dc:深拷贝 >>> d["name"]="Smith" #修改原始字典中的"name"值 >>> d {'gender': 'male', 'age': 25, 'name': 'Smith'} >>> c {'gender': 'male', 'name': 'milo', 'age': 25} >>> dc {'gender': 'male', 'name': 'milo', 'age': 25} >>> id(d) 52193080 >>> id(c) 52192760 >>> id(dc) 52192960可以看出,无论是深拷贝还是浅拷贝,原始字典与拷贝字典彼此独立占用内存空间。
因此,修改原始字典的某一项时,不影响拷贝字典。
明白了这一点之后,我们再看一个例子。
【例2】
>>> from copy import deepcopy >>> d={"name":["Bob","milo","Mary"],"gender":"male"}#d:原始字典 >>> c=d.copy() #c:浅拷贝 >>> dc=deepcopy(d) #dc:深拷贝 >>> d["name"].append("Smith")#修改原始字典中的"name"值 >>> d {'name': ['Bob', 'milo', 'Mary', 'Smith'], 'gender': 'male'} >>> c {'name': ['Bob', 'milo', 'Mary', 'Smith'], 'gender': 'male'} >>> dc {'name': ['Bob', 'milo', 'Mary'], 'gender': 'male'}看完此案例之后,普及一下:
浅拷贝:只拷贝父对象,不会拷贝对象内部的子对象。
深拷贝:拷贝父对象及其子对象。
也就是说,
※当你改变原始字典一级目录下(父级)的对象时,不会对拷贝字典产生任何影响。
因为 原始字典与拷贝字典彼此独立占用内存空间!
当你改变原始字典子目录下的对象时,对浅拷贝字典产生直接影响,不影响深拷贝。
因为 浅拷贝只拷贝父对象,不会拷贝对象内部的子对象,所以浅拷贝的子对象与原始字典保持一致!
而深拷贝由于拷贝父对象及其子对象,所以对它而言,任何对原始字典的修改都与它无关!
【例3】(不解释,检查一下你理解“深拷贝”与“浅拷贝”了吗?)
>>> from copy import deepcopy >>> x={"username":"admin","machine":["foo","bar","baz"]} >>> y=x.copy() >>> z=deepcopy(x) >>> x["username"]="mlh" >>> x["machine"][0]="bee" >>> x {'machine': ['bee', 'bar', 'baz'], 'username': 'mlh'} >>> y {'username': 'admin', 'machine': ['bee', 'bar', 'baz']} >>> z {'username': 'admin', 'machine': ['foo', 'bar', 'baz']}
----------------各种推导式----------------
推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种
(1)列表推导式。
功能:一种方便的列表创建方法,
格式:用中括号括起来,中间用for语句,后面跟if语句用作判读,满足条件的传到for语句前面用作构建先的列表
例:
>>> li=[i*2 for i in range(10) if i % 2 == 0] >>> print li [0, 4, 8, 12, 16] >>>
(2)字典推导式。
格式:跟列表推导式的用法差不多,只是不中括号改成大括号。
例:#快速交换字典 键—值
>>> mca={"a":1, "b":2, "c":3, "d":4} >>> dicts={v:k for k,v in mca.items()} >>> print dicts {1: 'a', 2: 'b', 3: 'c', 4: 'd'} >>>
(3)集合推导式。
功能:跟列表推导式差不多,都是对一个序列的元素全部执行相同的操作,但集合是一种无序的序列。
格式:1.不使用中括号,使用大括号;
2.结果中无重复;
3.结果是一个set()集合,集合里面是一个序列。
例:
>>> squared={i*2 for i in [1,1,2]} >>> print squared set([2, 4]) >>>
阅读全文
0 0
- 7.字典
- 7. Python字典数据
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 字典
- 排序算法的时间复杂度以及空间复杂度 计数排序
- 第一章 Spring Boot 之Hello World
- Android数据库加解密逆向分析(三)——微信数据库密码破解
- bzoj1391 [Ceoi2008]order 网络流——最大权闭合子图
- [第四章]设计、执行与结项
- 7.字典
- java-第一篇
- JDBC学习(一)
- Qt界面之QML优秀学习网站
- MYSQL客户端连接和断开MySQL服务器
- scramble string (使用动态规划和递归做)
- 网络直播进入整合期,三大模式值得关注
- 二叉树的镜像
- css判断ie版本才引用样式或css文件