Python快速学习第三天

第三天:

字典

什么是字典?

字典是Python语言中唯一的映射类型。

映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表。

字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型。

字典类型与序列类型的区别:

1.存取和访问数据的方式不同。 2.序列类型只用数字类型的键(从序列的开始按数值顺序索引); 3.映射类型可以用其他对象类型作键(如:数字、字符串、元祖,一般用字符串作键),和序列类型的键不同,映射类型的键直4.接或间接地和存储数据值相关联。 5.映射类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。 6.映射类型用键直接“映射”到值。

字典的创建

字典的基本形态dic={key1:value1, key2:value2...}

      创建方式1:直接型。

>>>dict1={}

>>>dict2={'name':'tanggao','age':20}

创建方式2:使用工厂方法dict,通过其他映射(例如字典)或者(键,值)这样的序列对建立

>>>items=[('name','tanggao'),('age',20)]

>>>dict2=dict(items)

>>>dict1=doct([('name','tanggao'),('age',20)])

    创建方式3:使用内建方法fromkeys()创建’默认‘字典,字典中元素具有相同的value(如果没有给出,默认为none)

>>>dict1={}.fromkeys(('x','y'))

>>> dict1

{'y': None, 'x':None}

>>>dict2={}.fromkeys(('x','y'),-1)

>>> dict2

{'y': -1, 'x': -1}

>>>dict3=dict.fromkeys('x','y')

>>> dict3

{'x': 'y'}

>>>dict3=dict.fromkeys(('x','y'))

>>> dict3

{'y': None, 'x':None}

>>> 

字典的基本操作

      Len(d)返回d中 键值对的数量

   d[k]返回关联到键k上的值

   d[k]=v将值v关联到键k上

   deld[k]删除键为k的项

   kin d检查d 中是否含有键为k的项

>>>dict1={'x':1,'y':2}

>>>dict1

{'y':2, 'x': 1}

>>>dict1['z']=3

>>>dict1

{'y':2, 'x': 1, 'z': 3}

>>>dict1['z']=4

>>>dict1

{'y':2, 'x': 1, 'z': 4}

>>>del dict1['z']

>>>dict1

{'y':2, 'x': 1}

>>>'x' in dict1

True

>>> 

字典的格式化字符串

>>>name= {'Tanggao':20,'ZhousiYuan':19}

>>>"Tanggao 's age is %(tanggao)s." % name

>>>"Tanggao 's age is %(Tanggao)s." % name

"Tanggao's age is 20."

>>> 

字典方法

1、   clear

清楚字典中所有的项,无返回值

>>>d={}

>>>d['name']='Tanggao'

>>>d['age']=20

>>>d

{'age':20, 'name': 'Tanggao'}

>>>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

{}

>>> 

2、   copy

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

相比于直接把某个字典赋给一个引用变量的区别如下:

>>>x={'x':1,'y':2}

>>>y=x

>>>y

{'y':2, 'x': 1}

>>>x['x']=33

>>>y

{'y':2, 'x': 33}

   但是下面两种情况:

   在副本中替换值的时候,原始字典不受影响

>>>x={'username':'admin','machines':['foo','bar','baz']}

>>>y=x.copy()

>>>y['username']='Tanggao'

>>>y

{'username':'Tanggao', 'machines': ['foo', 'bar', 'baz']}

>>>x

{'username':'admin', 'machines': ['foo', 'bar', 'baz']}

   修改了某个值,而不是替换,浅度复制的字典将受到影响,解决这种问题的方法就是使用深度复制deepcop方法

>>>fromcopy import deepcopy

>>>d={}

>>>d['name']=['tom','tg']

>>>c=d.copy()

>>>dc=deepcopy(d)

>>>d['name'].append('Gao')

#字典的值变了

>>>c

{'name':['tom', 'tg', 'Gao']}

#深度复制不受原始字典的影响了,完完全全是独立的了

>>>dc

{'name':['tom', 'tg']}

3、   fromkeys

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

>>>dict1={}.fromkeys(('x','y'))

>>>dict1

{'y':None, 'x': None}

>>>dict2={}.fromkeys(('x','y'),-1)

>>>dict2

{'y':-1, 'x': -1}

>>>dict3=dict.fromkeys('x','y')

>>>dict3

{'x':'y'}

4、   get

通过键访问值,平时如果通过一般方法访问键的值,如果键不存在会报错,而get方法不会

>>>d={}

>>>print d['name']

Traceback(most recent call last):

 File "<stdin>", line 1, in<module>

KeyError:'name'

>>>print d.get('name')

None

>>>d['name']='Tanggao'

>>>print d.get('name')

Tanggao

5、   has_key

检查字典中是否含有给出的键,相当于 key in d,但是Python3.0中没有这个方法

>>>d['name']='Tanggao'

>>>print d.get('name')

Tanggao

>>>d.has_key('name')

True

>>>d.has_key('age')

False

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方法的作用大致相同,但是会返回一个迭代器对象而不是列表,这个迭代器可以通过next0方法访问每个项,直到到达最后一个项,访问完最后一项,再接着遍历访问就会报错

>>>it=d.iteritems()

>>>it

<dictionary-itemiteratorobject at 0xbd70a8>

>>>it.next()

('url','http://www.python.org')

>>>it.next()

('spam',0)

>>>it.next()

('title','Python Web Site')

>>>it.next()

Traceback(most recent call last):

  File "<stdin>", line 1, in<module>

StopIteration

7、   key和iterkeys

key方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器

>>>ll=d.keys()

>>>ll

['url','spam', 'title']

>>>it1=d.iterkeys()

>>>it1.next()

'url'

>>>it1.next()

'spam'

>>>it1.next()

'title'

>>>it1.next()

Traceback(most recent call last):

  File "<stdin>", line 1, in<module>

StopIteration

8、   pop

pop方法将字典中的某项删除,以列表形式返回删除的项

>>>d={'title':'Python Web Site','url':'http://www.python.org','spam':0}

>>>d.pop('spam')

0

9、   popitem

随机弹出字典中的项

>>>d={'title':'Python Web Site','url':'http://www.python.org','spam':0}

>>>d.pop('spam')

0

>>>d={'title':'Python Web Site','url':'http://www.python.org','spam':0}

>>>d.popitem()

('url','http://www.python.org')

>>>d.popitem()

('spam',0)

>>>d.popitem()

('title','Python Web Site')

>>>d.popitem()

Traceback(most recent call last):

  File "<stdin>", line 1, in<module>

KeyError:'popitem(): dictionary is empty'

10、  setdefault

setdefalut方法能够获得与给定键相关联的值,除此之外,还能在字典中不含有给定键的情况下设定相应的键值。注意:如果键不存在的时候,setdefault返回默认值并且相应地更新字典,如果键存在,那么就返回与其对应的值,但是不改变字典。默认值可选,如果不设定,为None

>>>d={}

>>>d.setdefault('name','Tg')

'Tg'

>>>d

{'name':'Tg'}

>>>d['name']='Tom'

>>>d

{'name':'Tom'}

>>>d.setdefault('name','Tg')

'Tom'

>>>d

{'name':'Tom'}

>>>d1={}

>>>print d1.setdefault('name')

None

>>>d1

{'name':None}

11、  update

update方法可以利用一个字典更新另外一个字典,提供的字典的项会被添加到旧的字典中,若键相同,则覆盖

>>>d={'title':'Python Web Site','url':'http://www.python.org','spam':0}

>>>x={'title':'Tanggao is good ','age':20}

>>>d.update(x)

>>>d

{'url':'http://www.python.org', 'age': 20, 'spam': 0, 'title': 'Tanggao is good '}

>>> 

12、  values和itervalues

values方法以列表的形式返回字典中的值,itervalues返回值的迭代器

>>>d={}

>>>d[1]=1

>>>d[2]=2

>>>d[3]=3

>>>d[4]=1

>>>d.values()

[1,2, 3, 1]

>>>it=d.itervalues()

>>>it.next()

1

>>>it.next()

2

>>>it.next()

3

>>>it.next()

1

>>>it.next()

Traceback(most recent call last):

  File "<stdin>", line 1, in<module>

StopIteration

13、sorted

sorted(dic.iteritems(), key=lambda d:d[1], reverse=False)

说明:对字典dic中的元素按照d[1](d[1]是value,d[0]是key,和d没关系,可以改为a什么的)进行升序排序,通过设置reverse的True或False可以进行逆序,并返回排序后的字典(该排序后的字典由元组组成,其形式为[(key1,value1),(key2,value2),...],且原字典保持不变)

>>>d={'title':'Python Web Site','url':'http://www.python.org','spam':0}

>>>sorted(d)

['spam','title', 'url']

>>>sorted(d.iteritems(),key=lambda d:d[1])

[('spam',0), ('title', 'Python Web Site'), ('url', 'http://www.python.org')]

>>>sorted(d.iteritems(),key=lambda d:d[0])

[('spam',0), ('title', 'Python Web Site'), ('url', 'http://www.python.org')]

>>>sorted(d.iteritems(),key=lambda d:d[0],reverse=True)

[('url','http://www.python.org'), ('title', 'Python Web Site'), ('spam', 0)]

>>> 

方法总结:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Web行业观察

一张图撸明白prototype原型链

expression instanceof class expression和class都是必选项。

3334
来自专栏微信公众号:Java团长

Java基础09 类数据与类方法

我们一直是为了产生对象而定义类(class)的。对象是具有功能的实体,而类是对象的类型分类。这是面向对象的一个基本概念。

641
来自专栏CVer

排序算法 | 冒泡排序(含C++/Python代码实现)

排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。排序算法有很多,本文将介绍最经典的排序算法:冒泡排序...

1332
来自专栏lgp20151222

详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了....

但是,看了输出,我就纳闷为什么,为什么第三行不是BigEgg2.Yolk(),不能覆盖吗?

1682
来自专栏游戏开发那些事

【读书笔记】读《程序员面试宝典》

  最近有幸拜读了《程序员面试宝典》(第五版)这本书,此书真乃良心之作,尤其对于我们这种未毕业的学生来说,更是一本不可多得的宝贵资料。

2982
来自专栏kevindroid

JNI所需的C语言知识小结

1685
来自专栏程序员互动联盟

【专业技术】你必须注意的11个C++要点

下面的这些要点是对所有的C++程序员都适用的。我之所以说它们是最重要的,是因为这些要点中提到的是你通常在C++书中或网站上无法找到的。如:指向成员的指针,这是许...

2775
来自专栏一“技”之长

Swift专题讲解十六——ARC在Swift中的应用

        ARC(自动引用计数)是Objective-C和Swift中用于解决内存管理问题的方案。在学习Objective-C编程时经常会学习到一个关于A...

872
来自专栏carven

浅谈闭包

闭包 – closure, 应该可以说是javascript的一个难点吧, 其实说难也不难, 只是因为没有真正一个权威的人/书去给他一个真正的定义。 不过,学编...

940
来自专栏用户2442861的专栏

C++编程思想重点笔记

引申:如何在const成员函数里修改成员 —— 按位和与按成员const 如果我们想要建立一个const成员函数,但仍然想在对象里改变某些数据,这时该怎...

2031

扫码关注云+社区

领取腾讯云代金券