python里clear和copy_python之字典
通过名字引用值得数据结构.这种结构类型称为映射.字典是python中唯一内建的映射类型.字典中的值并没有特殊的顺序,但是都存储在一个特定的键里.键可以是数字,字符串甚至是元组.
某些情况下,字典比列表更加适用:
1.表征游戏棋盘的状态,每个键都是由坐标值组成的元组;
2.存储文件修改次数,用文件名作为键;
3.数字电话/地址薄
假如有一个人名列表如下:
>>> names = ['Alice','Beth','Cecil','Earl']
>>> numbers = ['3123','3125','5654','9877']
>>> numbers[names.index('Cecil')]
'5654'
>>>
看到这里读者会疑问:为什么用字符串而不用整数表示电话号码呢?
>>> 0142
98
>>>
因为进制的原因 所以不能这样使用
4.2 创建和使用字典
phonebook = {'Alice':'1234','Beth':4321}
字典由多个键与其对应的值构成的对组成. 名字是键 号码是 值.
字典中的键是唯一的,而值并不是唯一的
4.2.1 dict函数
可以用dict函数,通过其他映射或者这样的序列对建立字典.
>>> items = [('name','Gumby'),('age',42)]
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
>>> d['name']
'Gumby'
>>>
dict函数也可以通过关键字参数来创建字典
>>> d = dict(name='Gumby',age=42)
>>> d
{'age': 42, 'name': 'Gumby'}
>>>
这可能是dict函数最有用的功能但是还能以映射作为dict函数的参数,以建立其项与映射相同的字典(如果不带任何参数,则dict函数返回一个新的空字典,就像list,tuple以及str等函数一样).如果另一个映射也是字典,也可以使用本章稍后讲到的字典方法copy.
4.4.4 基本字典操作
字典的基本行为在很多方面与序列类似:
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的项
尽管字典和列表有很多特性相同,但也有下面一些重要的区别.
键类型:字典的键不一定为整型数据(但也可能是),也可能是其他不可变类型,比如浮点型(实型),字符串或者元组.
自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。而不能将值关联到列表范围之外的索引上。
成员资格:表达式k in d (d为字典)查找的键,而不是值。表达式v in l(l为列表)则是用来查找值,而不是索引。
在字典中检查键的成员资格比在列表中检查值得成员资格更高效,数据结构的规模越大,两者的效率差距越明显。
第一点---------键可以为任何不可变类型-----是字典最强大的地方。第二点也很重要。
>>> x = {}
>>> x[42] = 'Foobar'
>>> x
{42: 'Foobar'}
>>>
首先,程序试图将字符串'Foobar'关联到一个空列表的42号位置上--------这显然是不可能的,因为这个位置根本不存在。为了将其变为可能,我必须用[None] * 43 或者其他方式初始化x,而不能仅使用[]。但是,下一个例子工作得很好。我将‘Foobar’关联到空字典的键42上,没问题!新的项已经添加到字典中。
4.1 字典示例
#!/usr/bin/env python
people = {
'Alice':{'phone':'2341','addr':'Foo drive 23'},
'Beth':{'phone':'1234','addr':'Bar street 32'},
'Cecil':{'phone':'1234','addr':'Baz avendas 90'}
}
labels = {'phone':'phone number','addr':'address'}
name = raw_input('Name: ')
request = raw_input('phone number(p) or address(a)? ')
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
if name in people: print "%s's %s is %s." % \
(name,labels[key],people[name][key])
执行结果
[root@pankuo ~]# ./python.py
Name: Alice
phone number(p) or address(a)? a
Alice's address is Foo drive 23.
4.2.3 字典的格式化字符串
>>> phonebook = {'Beth':'9102','Alice':'2341','Cecil':'3258'}
>>> phonebook
{'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}
>>> "Cecil's phone number is %(Cecil)s." % phonebook
"Cecil's phone number is 3258."
>>>
除了增加的字符串键之外,转换说明符还是像以前一样工作.当以这种方式使用字典的时候,只要所有给出的键都能在字典中找到,就可以获得任意数量的转换说明符.这类字符串格式化在模板系统中非常有用
>>> template = '''
...
%(title)s
...
...
%(title)s
...
%(text)s
...
'''
>>> data = {'title': 'My Home Page','text': 'Welcome to my home page'}
>>> print template % data
My Home Page
My Home Page
Welcome to my home page
>>>
4.2.4 字典方法
就像其他内建类型一样,字典也有方法.这些方法非常有用,但是可能不会像使用列表或者字符串方法那样频繁地使用.
1.clear
clear方法清除字典中所有的项.
>>> d = {}
>>> d['name'] = 'Gumby'
>>> d['age'] = 42
>>> d
{'age': 42, 'name': 'Gumby'}
>>> returned_value = d.clear()
>>> d
{}
>>> print returned_value
None
>>>
第一种方法
>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x = {}
>>> y
{'key': 'value'}
>>>
第二种
>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x.clear()
>>> y
{}
>>>
两种情况中,x和y最初对应同一个字典。情况1中,我通过将x关联到一个新的空字典来清空它,这对y一点影响也没有,它还关联到原先的字典。这可能是所需要的行为,但是如果真的想清空原始字典中所有的元素,必须使用clear方法。
2.copy
copy方法返回一个具有相同键-值对的新字典。这个方法实现的是浅复制,因为值本身就是相同的,而不是副本
>>> x = {'username':'admin','machines':['foo','bar','baz']}
>>> y = x.copy()
>>> y['username'] = 'mlh'
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}
>>>
可以看到,当在副本中替换值得时候,原始字典不受影响,但是,如果修改了某个值(原地修改,而不是替换),原始的字典也会改变,因为同样的值也存储在原字典中。
避免这个问题的一种方法就是使用深复制,复制其包含所有的值。可以使用copy模块的deepcopy函数来完成操作:
>>> from copy import deepcopy
>>> d = {}
>>> d['names'] = ['Alfred','Bertrand']
>>> c = d.copy()
>>> dc = deepcopy(d)
>>> d['names'].append('Clive')
>>> c
{'name': ['Alfred', 'Bertrand']}
>>> dc
{'name': ['Alfred', 'Bertrand']}
>>>
3.fromkeys
fromkeys方法使用给定的键建立新的字典,每个键默认对应的值为none
>>> {}.fromkeys(['name','age'])
{'age': None, 'name': None}
>>>
刚才的例子中首先构造了一个空字典,然后调用它的fromkeys方法,建立另外一个词典---有些多余。也可以直接在所有字典的类型dict上面调用方法。
>>> dict.fromkeys(['name','age'])
{'age': None, 'name': None}
>>>
如果不想使用None作为默认值,也可以自己提供默认值
>>> dict.fromkeys(['name','age','(unknown)'])
{'(unknown)': None, 'age': None, 'name': None}
>>>
4.get
get方法是个更宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会出错:
>>> d = {}
>>> print d['name']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'name'
>>> print d.get('name')
None
>>>
可以看到,当使用get访问一个不存在的键时,没有任何异常,而得到了None值。还可以自定义 默认 值,替换None
>>> d.get('name','N/A')
'N/A'
>>>
如果键存在,get用起来就像普通的字典查询一样:
>>> d['name'] = 'Eric'
>>> d.get('name')
'Eric'
>>>
4-2 字典方法示例
#!/usr/bin/env python
labels = {'phone':'phone number','addr':'address'}
name = raw_input('Name: ')
request = raw_input('phone number(p) or address(a)? ')
key = request
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
person = people.get(name,{})
label = labels.get(key,key)
result = person.get(key,'not available')
print "%s's %s is %s." % (name,label,result)
5.has_key
has_key方法可以检查字典中是否含有给出的键。表达式d.has_key(k)相当于表达式k in d。使用哪个方式很大程度上取决于个人的喜好。
>>> d = {}
>>> d.has_key('name')
False
>>> d['name'] = 'Eric'
>>> d.has_key('name')
True
>>>
6.items 和 iteritems
items方法将所有的字典项以列表方式返回,这些列表项中的每一项都来自于(键,值)。但是项在返回时并没有特殊的顺序
>>> d = {'title':'python web site','url':'http://www.python.org','spam':0}
>>> d.items()
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'python web site')]
iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表
>>> it = d.iteritems()
>>> it
>>> list(it)
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'python web site')]
7.keys和iterkeys
keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器
8.pop
pop方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除。
>>> d = {'x':1,'y':2}
>>> d.pop('x')
1
>>> d
{'y': 2}
>>> d.pop('y')
2
>>> d
{}
>>>
9.popitem
popitem方法类似于list.pop,后者会弹出列表的最后一个元素。但不同的是,popitem弹出随机的项,因为字典并没有”最后的元素“或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效了
>>> d = {'url':1,'spam':2,'title':3}
>>> d.popitem()
('url', 1)
>>> d
{'title': 3, 'spam': 2}
>>>
尽管popitem和列表pop方法很类似,但字典中没有与append等价的方法。因为字典是无序的,类似于append的方法是没有任何意义的
10.setdefault
setdefault方法在某种程度上类似于get方法,就是能够获得与给定键相关联的值,除此之外,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'}
>>>
可以看到,当键不存在的时候,setdefault返回默认值并且相应地更新字典。如果键存在,那么就返回与其对应的值,但不改变字典。默认值是可选的,这点和get一样。如果不设定,会默认使用None。
>>> d = {}
>>> print d.setdefault('name')
None
>>> d
{'name': None}
>>>
11.update
update方法可以利用一个字典项更新另外一个字典:
>>> d = {'title':'python web site','uil':'http://www.baidu.com','changed':'Mar 14 22:09:15 MET 2008'}
>>> x = {'title':'python language website'}
>>> d.update(x)
>>> d
{'changed': 'Mar 14 22:09:15 MET 2008', 'uil': 'http://www.baidu.com', 'title': 'python language website'}
>>>
提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖。
update方法可以使用与调用dict函数同样的方式进行调用,这点在本章前面已经讨论,这就意味着update可以和映射,拥有(键,值)对的队列(或者其他迭代的对象)以及关键字参数一起调用。
12.values和itervalues
values方法以列表的形式返回字典中的值(itervalues返回值的迭代器)。与返回键的列表不同的是,返回值得列表中可以包含重复的元素:
>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d[4] = 1
>>> d.values()
[1, 2, 3, 1]
>>>
python里clear和copy_python之字典相关推荐
- python里clear和copy_python (集合和深浅拷贝)
一. 知识点补充 1. 列表和字典不能在循环过程中进行增删操作,因为列表索引在循环过程会发生改变,字典规定循环不可改变. 删除方法: 将需要大量删除的列表或者字典遍历取出要删除的对象,放入一个空列表, ...
- [转载] python里字典的用法_python中字典(Dictionary)用法实例详解
参考链接: Python字典dictionary copy方法 本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映 ...
- python映射类型-python 基础学习 — 映射类型:字典
一.字典: { } 字典是 Python 语言中唯一的映射类型.映射类型对象里哈希值(键) 和指向的对象(值)是一对多的关系. 二.创建字典 d1 = {'name': 'earth', 'port' ...
- python里面的dict和set
python里面的dict和set dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速 ...
- 洗礼灵魂,修炼python(8)--高效的字典
python几大核心之--字典(dict) 1.什么是字典 学生时代都用过字典吧?通过这个字的读音或者偏旁就能用字典查到其相关信息,词性,意思,组词,造句,还有在什么场合下用这个字等等的. 在pyth ...
- Python学习第七课-元组字典集合
Python学习第七课-元组&字典&集合 一.元组 1.1元组简介 1.2元组的拆包 1.3字符串拆包 1.4列表的拆包 1.5拆包练习 二.字典的简介 2.1介绍 2.2操作 三.字 ...
- Python 炫技操作:合并字典的七种方法
来源 | Python编程时光(ID: Cool-Python) Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看 ...
- 一篇长文带你在python里玩转Json数据
Json简介 Json(JavaScript Object Notation) 很多网站都会用到Json格式来进行数据的传输和交换. 这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方 ...
- 下列哪个不是目前python里的内置模块-python中那些小众但有用的内置模块
今天带来的是python里一些小众但是却比较实用的python库,一起来看看吧! pprint:更清晰的打印 pprint 是 pretty printer 的缩写,用来打印 Python 数据结构, ...
最新文章
- python 单一进程实例 实现
- pandas里面已经是sort_values()啦
- linux内核路由反向检查,反向路径过滤
- 晒晒女儿学国画一学期的成果
- 是用Entity.Save(),还是用DAL.Save(Entity e)
- mssql sqlserver 不固定行转列数据(动态列)
- MySQL 批量生成 SQL 脚本语句解决实际的业务需求/如何拼接字符串/拼接字符串的 SQL 语句
- Navicat Premium 12连接SQLServer[ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序
- 练习题︱豆瓣图书的推荐与搜索、简易版知识引擎构建(neo4j)
- 熵(Entropy):机器学习
- msfvenom手册
- windows下安装启动rocketmq可视化界面
- 数据说话:众安保险土豪式融资的背后
- Python入门到放弃系列一
- 【java】简单练习-打印斜坡
- 免费获得Java 7并发食谱
- [译] 苹果公司如何弯道超车颠覆传统瑞士制表业
- 既约分数(python)
- python中成绩及格判断代码_用python输入一个百分制考试成绩,判断是否及格并输出结果?...
- 亲测好用!这4个免费的二维码生成器,制作简单易上手
热门文章
- vue 移动到图片浮动_基于Vue实现图片在指定区域内移动
- td 字典表_数据库怎么设计字典表
- 【渝粤教育】电大中专消费者心理学_1作业 题库
- 下载不了java应用程序_Java 7u45 - java webstart不会下载我的jar并执行应用程序,除非我显示java控制台...
- matlab二元一次方程求解_高中化学二元混合物的十字交叉法解法
- ese如何实现支付 nfc_海运费如何实现快捷支付?答案有了
- php ajax 更改状态,phpajax实现无刷新获取天气状态_PHP教程
- 建立时间、保持时间与亚稳态
- 信号与系统 chapter11 LTI系统的响应
- 算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。