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]

>>>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用类-会员信息

录入会员生日,形式必须是“月/日”,如“09/12”;录入的密码必须在6-10位之间;允许用户重复输入,直到输入正确为止。 1 package demo3;2 3 import java.util.Scanner;4 5 public class Test8 {6 public static void…

GDAL学习总结

GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过…

matlab能用矩阵操作就不要用for循环

1.MATLAB尽量少用for循环来操作矩阵,多用本身的矩阵操作函数 比如,想将矩阵的第三列通过第二列计算得到,以下两种方式得到的结果一致,但不用for更简洁。 a 6; feature_labelnum(:,3) a * sqrt(feature_labelnum(:,2));%第三列…

jsp快到截止日期字体颜色变色_jsp页面中字体变色问题 - Java / Web 开发

jsp页面中字体变色问题 - Java / Web 开发[title]function diyCheck(){var fm document.frmMain;s1fm.YEAR.value;if(s12010){}年 [YEAR]计划 [PLANINOROUT] 问题:当页面中年的值为2009时正常显示,如果年的值为2010时,字体颜色变为红色&…

基于Flask、MySQL和Echarts的*市CPI和物价水平数据可视化分析

基于Flask、MySQL和Echarts的*市CPI和物价水平数据可视化分析 引言: 在当前社会经济背景下,CPI(居民消费价格指数)和物价水平的波动对市场和居民生活产生直接影响。本文将介绍一款基于Flask、MySQL和Echarts的数据可视化系统&…

windows server 2008 iis6.0 无法下载.exe

以下都是我自己的见解,如果有不对的地方,请各位大佬纠正,谢谢。 正常来讲,访问.exe文件,只需要在mini类型添加 application/octet-stream 后缀名 .exe 就可以下载.exe文件的。 这里是我配置了 application/octet-strea…

MATLAB错误:‘conv2’

MATLAB错误 Undefined function conv2 for input arguments of type double and attributes full 3d real. 原因:Color images are 3 dimensional arrays (x,y,color). conv2 is only defined for 2-dimensions, so it wont work directly on a 3-dimensional ar…

抽象工厂模式设计模式_抽象工厂设计模式解释

抽象工厂模式设计模式抽象工厂设计模式是工厂设计模式的另一种形式。 这种模式可以被视为“超级工厂”或“工厂工厂”。 抽象工厂设计模式(属于“四人帮”的一部分)属于“创新设计模式”类别,它提供了一种方法来封装一组具有公共链接的工厂而…

json php 数组读写_PHP如何将数据写入JSON?

I am newer for php. I want make php page cache, query data from mysql and store data into json format.I have many questions:which type of file should I store? .json or .txt or .cache? for I also need use json decode return datas into page.I want use cron…

加密后24位且最后两位是==

发现 某 xml 文件中的 标签 id 都是 24位大小写字母、数字加号、/等 共计 24位 且最后两位都是 测试发现用 16位数字经过base64可以得到类似的 格式 加密前:1234567890123456加密后:MTIzNDU2Nzg5MDEyMzQ1Ng 我这里的需求不是要解密,只是要模…

Java Syncrhonisers

线程通信主要通过共享对字段和对象的访问来发生。 尽管这种通信方式非常高效,但它易于出现诸如线程干扰和内存一致性之类的错误。 同步是一种有助于防止此类错误的工具。 但是,同步不是免费提供的,并且在访问当前由另一个线程持有的锁或对象…

MATLAB的VLFeat工具箱

下载地址:http://www.vlfeat.org/ 简介:VLFeat开源库实现了流行的计算机视觉算法,专门用于图像理解和局部特征提取和匹配。算法包括Fisher向量、VLAD、SIFT、MSER、k-means、分级k-means、agglomerative information bottleneck、SLIC超像素…

Phinecos(洞庭散人) 专注于开源技术的研究与应用 TinyXML:一个优秀的C++ XML解析器

读取和设置xml配置文件是最常用的操作,试用了几个C的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C,能…

windows聚焦壁纸不更新_Win10无法自动更换聚焦锁屏壁纸怎么办?

Win10无法自动更换聚焦锁屏壁纸怎么办?在Win10系统的默认情况下,锁屏界面设置的是Windows聚焦,如果我们使用微软账户登录,系统会自动更换锁屏壁纸,让我们每天都能看到不一样的锁屏壁纸。然而有用户发现,系统…

jdbc-------JDBCUtil类 工具类

jdbcutil 主要处理的是 连接数据库, 和关闭各个流 1, 数据库连接的配置信息: mysql.properties (在工程的目录下)个人配置 urljdbc:mysql://localhost:3306/test drivercom.mysql.jdbc.Driver usernameroot password123 2, 获取连…

1.关于python

开始时间:2018年12月6日19:13:24 python第一次接触,将学习《简明python3教程》这本书,顺便做下笔记。 ----------------------------------------------------------------------------------------------------- 1、python的特点&#xf…

mybatis 使用in 查询时报错_MyBatis(四):mybatis中使用in查询时的注意事项

packagecom.boco.jobmonitor.model;importjava.util.Date;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;public classJobitem {/*** 唯一键 pk* 列名:id 类型:INTEGER(10) 允许空:false 缺省值:null*/IdGenerat…

python网络聊天器多线程版

在之前的一篇文章(python网络编程-udp)中实现了一个简单的udp聊天器,只能在单线程下进行收发数据,在学习完多线程之后,实现一个能同时收发数据的udp聊天器。 说明: 编写一个有2个线程的程序线程1用来接收数…

CentOS 7 / RHEL 7 systemd 指令

CentOS 7 已经切换到 systemd,系统指令也有所变化。之前用于启动、重启、停止各种服务的service 作为向后兼容的指令还能使用,但是将来可能会消失。同时,chkconfig 也改成了systemctl 了。这里列举了一些常用的对应于 service 和 chkconfig 的…

隔离域逻辑

在一个设计模式类中,我对建模域逻辑进行了有趣的讨论。 具体来说,它与隔离域逻辑有关 。 应用程序通常分为三个部分: 演示(例如桌面GUI,浏览器,Web服务) 域逻辑 基础架构(例如持久…