自学python笔记10–字典
字典相关知识温习:
字典使用名称-内容进行数据的构建,在Python中分别对应着键(key)一值(value),习惯上称之为键值对。字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。
字典的特征总结如下:
1.字典中数据必须是以键值对的形式出现的;
2.逻辑上讲,键是不能重复的,而值可以重复;
3.字典中的键(key)是不可变的,也就是无法修改的;而值(value)是可变的,可修改的,可以是任何对象。
字典的一般书写形式:
例:
yyss={'BIDU':'Baidu','SINA':'Sina','YOKU':'Youku'}
dict()
item=[('name','aurora'),('age',42)]
d=dict(item)
print(d)
print(d['name'])
结果为:
也可以使用关键字实参来调用这个函数,可以写成如下形式:
d=dict(name='aurora',age=42)
print(d)
print(d['name'])
结果仍然为
一、基本的字典操作
字典的基本行为在很多方面都类似于序列。
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的项。
一个简单的应用:
# 一个将人名用作键的字典。每个人都用一个字典表示,
# 字典包含键'phone'和'addr',它们分别与电话号码和地址相关联
people = {
'Alice': {
'phone': '2341',
'addr': 'Foo drive 23'
},
'Beth': {
'phone': '9102',
'addr': 'Bar street 42'
},
'Cecil': {
'phone': '3158',
'addr': 'Baz avenue 90'
}
}
# 电话号码和地址的描述性标签,供打印输出时使用
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = input('Name: ')
# 要查找电话号码还是地址?
request = input('Phone number (p) or address (a)? ')
# 使用正确的键:
if request == 'p':
key = 'phone'
if request == 'a':
key = 'addr'
# 仅当名字是字典包含的键时才打印信息:
if name in people: print("{}'s {} is {}.".format(name, labels[key], people[name][key]))
结果为
在labels[key], people[name][key]
的使用中包含到了d[k]返回与键k相关联的值这一条。
二、将字符串格式设置功能于字典
在字典中包含各种信息,这样只需在格式字符串中提取所需的信息即可。为此,
必须使用format_map来指出你将通过一个映射来提供所需的信息。
phonebook={'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}
print("Cecil's phone number is {Cecil}.".format_map(phonebook))
结果为:
三、字典方法
1.clear
方法clear删除所有的字典项,这种操作是就地执行的(就像list.sort一样),因此什么都不返回(或者说返回None)。
#clear
d={}
d['name']='aurora'
d['age']=19
print(d)
returned_valued=d.clear()
print(d)
结果为
1.2 字典的clear和赋值空字典的区别
代码1:
x = {}
y = x
x['key'] = 'value'
print(y)
x = {}
print(x)
print(y)
结果为:
代码2:
x = {}
y = x
x['key'] = 'value'
print(y)
x.clear()
print(x)
print(y)
结果为:
由代码1、2进行对比,x和y最初都指向同一个字典。通过将一个空字典赋给x来“清空”它。这对y没有任何影响,它依然指向原来的字典。但如果使用clear,这样y也将清空。
2.copy
2.1浅复制
#copy
x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
y=x.copy()
print(y)
y['username']='aurora'
x['machines'].remove('bar')
print(x)
print(y)
y['machines'].remove('foo')
print(x)
print(y)
执行y=x.copy()
之后,y的情况
执行y['username']='aurora' x['machines'].remove('bar')
之后,x,y分别为
在执行完y['machines'].remove('foo')
之后,x,y分别为
这说明当替换副本中的值时,原件不受影响。
(在y的基础上修改元素的值,不影响x中该元素的值)
然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化。
(删除y中的元素,x中的元素也会受到影响)
2.2深复制
#deepcopy
from copy import deepcopy
d={}
d['name']=['aurora','peter']
c=d.copy()
dc=deepcopy(d)
d['name'].append('abcd')
print(c)
print(dc)
结果为:
故使用deepcopy不受原字典改变的影响。
3.fromkeys
方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None。
#fromkeys
print(dict.fromkeys(['name','age']))
#可提供特定的值
print(dict.fromkeys(['name','age'],'(unknown)'))
结果为:
4.get
方法get为访问字典项提供了宽松的环境。通常,如果你试图访问字典中没有的项,将引发错误。但使用get来访问不存在的键时,没有引发异常,而是返回None。
#get
a={}
a['name']='aurora'
print(a.get('name'))
结果为:
# 一个使用get()的简单数据库
people = {
'Alice': {
'phone': '2341',
'addr': 'Foo drive 23'
},
'Beth': {
'phone': '9102',
'addr': 'Bar street 42'
},
'Cecil': {
'phone': '3158',
'addr': 'Baz avenue 90'
}
}
# 电话号码和地址的描述性标签,供打印输出时使用
labels = {
'phone': 'phone number',
'addr': 'address'
}
name = input('Name: ')
# 要查找电话号码还是地址?
request = input('Phone number (p) or address (a)? ')
# 使用正确的键:
key = request # 如果request既不是'p'也不是'a'
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'
# 使用get提供默认值
person = people.get(name, {})
label = labels.get(key, key)
result = person.get(key, 'not available')
print("{}'s {} is {}.".format(name, label, result))
结果为:
5.items
方法items返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式。字典项在列表中的排列顺序不确定。
#items
b= {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
print(b.items())
输出结果:
返回值属于一种名为字典视图的特殊类型。字典视图可用于迭代。另外,你还可确定其长度以及对其执行成员资格检查。
6.pop
方法pop可用于获取与指定键相关联的值,并将该键值对从字典中删除。
c={'x':1,'y':2}
print(c.pop('x'))
print(c)
结果为:
7.update
方法update使用一个字典中的项来更新另一个字典。
e={'title': 'Python Web Site','url': 'http://www.python.org','changed': 'Mar 14 22:09:15 MET 2016'}
f= {'title': 'Python Language Website'}
e.update(f)
print(e)
结果为:
对于通过参数提供的字典,将其项添加到当前字典中。如果当前字典包含键相同的项,就替换它。
小结
1.映射:映射让你能够使用任何不可变的对象(最常用的是字符串和元组)来标识其元素。
Python只有一种内置的映射类型,那就是字典。
2.将字符串格式设置功能用于字典:要对字典执行字符串格式设置操作,不能使用format
和命名参数,而必须使用format_map。
3.字典方法:字典有很多方法,这些方法的调用方式与列表和字符串的方法相同。
持续更新。