字典
字典
可通过名称来访问其各个值的数据结构,这种数据结构称为映射(mapping),字典是python中唯一的内置映射类型,其中的值不按顺序排序,而是储存在键下。键可能是数、字符串或元组。
字典由键及其相应的值组成,这种键-值对称为项(item);在字典中键必须是独一无二的,而字典中的值无需如此;
空字典(没有任何项)用两个花括号表示{}
函数dict
可使用函数dict从其它映射(如其它字典)或键-值对序列创建字典
>>>items=[("name","gumby"),("age",42)]
>>>d=dict(items)
>>>d --->{'name': 'gumby', 'age': 42}
>>>d["name"] --->'gumby'
>>>d=dict(name="gumby",age=42)
>>>d --->{'name': 'gumby', 'age': 42}
基本的字典操作
len(d) 返回字典d包含的项(键-值)数
d[k] 返回与键k相关联的值
d[k]=v 将v值关联到键k
del d[k] 删除键为k的项
k in d 检查字典d中是否包含键为k的项
键的类型:字典中的键可以是整数,也可以是任何不可变的类型,如浮点数、字符串或元组
自动添加:即便字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。
成员资格:表达式k in d(其中d为字典)查找的是键而不是只
>>>x={}
>>>x[42]="foobar"
>>>x ---{42: 'foobar'}
字典示例:
#一个简单的数据库
#一个将人名用作键的字典,每个人都用一个字典表示
#字典包含键phone和addr,分别与电话号码和地址相关联
people = {
'Alice':{
'phone': '1234'
'addr': 'foo drive 23'
},
'Beth':{
'phone': '5678'
'addr': 'bar street 42'
},
'Cecil':{
'phone': '9090'
'addr': 'bax 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]))
-------------------------------
将字符串格式设置功能用于字典
使用format_map来指出将通过一个映射来提供所需的信息:
>>>phonebook={'Beth': '5678','Alice': '1234','Cecil':'9090'}
>>>"Cecil's phone number is {Cecil}.".format_map(phonebook)
--->"Cecil's phone number is 9090."
字典方法
1、clear:删除所有的字典项,就地执行,因此什么都不返回(或者说返回None)
>>>d={}
>>>d['name'] ='gumby'
>>>d['age'] = 42
>>>d --->{'name': 'gumby', 'age': 42}
>>>return_value=d.clear()
>>>d --->{}
>>>print(return_value) --->None
示1:
>>>x={}
>>>y=x
>>>x['key'] = 'value'
>>>y --->{'key': 'value'}
>>>x={}
>>>y --->{'key': 'value'}
示2:
>>>x={}
>>>y=x
>>>x['key'] = 'value'
>>>y --->{'key': 'value'}
>>>x.clear()
>>>y --->{}
>>>x --->{}
注:在示1示2中,x和y最初都指向同一个字典,在示1中通过空字典赋给x来清空,这对y没有任何影响,它依然指向原来的字典。
2、copy:方法copy返回一个新字典,其包含的键-值对与原来的字典相同(浅复制)
>>>x = {'username':'admin','machines':['foo','bar','baz']}
>>>y=x.copy()
>>>y --->{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>>y['username'] = 'clouder'
>>>y['machines'].remove('bar')
>>>y --->{'username': 'clouder', 'machines': ['foo', 'baz']}
>>>x --->{'username': 'admin', 'machines': ['foo', 'baz']}
注:当替换副本中的值时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化,因为原件指向的也是被修改的值。
另一种方法是执行深复制,即同时复制值及其包含的所有值。为此,可使用模块copy中的函数deepcopy
>>>from copy import deepcopy
>>>d = {}
>>>d['name'] = ['alfred','bertrand']
>>>a = d.copy()
>>>b = deepcopy(d)
>>>d['name'].append('clive')
>>>a --->'name': ['alfred', 'bertrand', 'clive']}
>>>b --->{'name': ['alfred', 'bertrand']}
3、fromkeys:方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None
>>>{}.fromkeys(['name','age']) --->{'name': None, 'age': None}
注:首先创建了一个空字典,再对其调用方法fromkeys来创建另一个字典。
>>>dict.fromkeys(['name','age']) --->{'name': None, 'age': None}
若不想使用默认值None,可提供特定的值:
>>>dict.fromkeys(['name','age'],'unknown') --->{'name': 'unknown', 'age': 'unknown'}
4、get:方法get为访问字典提供了宽松的环境。通常试图访问字典中内有的项时,将引发错误;而get不会这样。
>>>d = {}
>>>print(d['name']) ---引发错误
>>>print(d.get('name')) --->None
可指定返回的值:
>>>d.get('name','N/A') --->'N/A'
示例:
#一个使用get()的简单的数据库
#插入前面的字典people
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,,{})
lable = labels.get(key,key)
result = person.get(key,"not available")
print("{}'s {} is {}.".format(name,label,result))
5、items:方法items返回一个包含所有字典项的列表,其中每个元素都为(key,value)形式。字典项在列表中的排列顺序不确定。
>>>d = {"title": "python web site", "url": "http:///www.python.org", "spam": 0}
>>>d.items() --->dict_items([('title', 'python web site'), ('url', 'http:///www.python.org'), ('spam', 0)])
注:返回值是一种字典视图的特殊类型。字典视图可用于迭代,另还可以确定其长度和成员资格检查。
>>>it=d.items()
>>>len(it) --->3
>>>("spam",0) in it --->True
若要将字典项复制到列表中:
>>>list(d.items()) --->[('title', 'python web site'), ('url', 'http:///www.python.org'), ('spam', 0)]
6、keys:方法keys返回一个字典视图,其中包含指定字典中的键
7、pop:方法pop可用于获取与指定键相关联的值,并将该键-值从字典中删除
>>>d = {"x": 1, "y": 2, "z": 3}
>>>d.pop('x') --->1
>>>d --->{'y': 2, 'z': 3}
8、popitem:方法popitem类似于list.pop,但list.pop会弹出列表中的最后一个元素,而popitem随机的弹出一个字典项,因为字典中的顺序是不确定的,没有"最后一个元素"的概念。若要以高效的方式逐个删除并处理所有的字典项,这可能很有用。
>>>d = {"title": "python web site", "url": "http:///www.python.org", "spam": 0}
>>>d.popitem() --->('spam', 0)
>>>d --->{'title': 'python web site', 'url': 'http:///www.python.org'}
9、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'}
注:指定的键不存在是,setdefaule返回指定的值并相应的更新字典,若指定的键存在,就返回其值,并保持字典不变。
10、update:方法update使用一个字典中的项来更新另一个字典
>>>d = {"title": "python web site", "url": "http:///www.python.org", "changed": "Mar 24 12:22:09 MET 2018"}
>>>>x= {"title": "python language web"}
>>>d.update(x)
>>>d --->{'title': 'python language web', 'url': 'http:///www.python.org', 'changed': 'Mar 24 12:22:09 MET 2018'}
>>>d = {"title": "python web site", "url": "http:///www.python.org", "changed": "Mar 24 12:22:09 MET 2018"}
>>>>x= {"http": "http web site"}
>>>d.update(x)
>>>d --->{'title': 'python web site', 'url': 'http:///www.python.org', 'changed': 'Mar 24 12:22:09 MET 2018', 'http': 'http web site'}
注:通过参数提供的字典,将其项添加到当前的字典中;若当前的字典中包含有相同的项,则替换它。
11、values:方法values返回一个由字典的值组成的字典视图。不同于方法keys,方法values返回的视图可能包含重复的值
>>>d = {}
>>>d[1] = 1
>>>d[2] = 2
>>>d[3] = 3
>>>d[4] = 1
>>>d.values() --->dict_values([1, 2, 3, 1])