字典是python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键不可修改且不能重复的,所以其可能是数字、字符串或元组,而不可能是list。字典中键-值对被称为项(item),其语法如下:
{"Alice": 12, "Beth": 11, "Danny": 14}
1 函数dict
>>> items = [('name', 'Alice'), ('age', 12)]
>>> d = dict(items)
>>> d
{'name': 'Alice', 'age': 12}
>>> d = dict(name='Beth', age=11)
>>> d
{'name': 'Beth', 'age': 11}
2 基本操作
len(d):返回字典d中的(键值对数)项数。
d[k]:返回与键k相关联的值。
d[k] = v:将v的值关联到键k。
del d[k]:删除键为k的项。
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]))
运行结果:
Name:Beth
Phone number (p) or address (a)? p
Beth's phone number is 9102
3 字典方法
3.1 clear
清除所有的字典项,没有返回值。
d = {}
d["name"] = "Gumby"
d["age"] = 42
print(d)
d.clear()
print(d)
{'name': 'Gumby', 'age': 42}
{}
3.2 copy
返回一个新字典,这个方法是浅复制。当替换副本的值时,原件不受影响;然而,如果修改副本中的值,原件也会改变。因为原件指向的也是被修改的值。
# 浅复制
x = {"username": "admin", "machines": ["foo", "bar", "baz"]}
y = x.copy()
y["username"] = "mlh"
y["machines"].remove("bar")
print("y:", y)
print("x:", x)
运行结果:
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")
print("c:", c)
print("dc:", dc)
运行结果:
c: {'names': ['Alfred', 'Bertrand', 'Clive']}
dc: {'names': ['Alfred', 'Bertrand']}
3.3 fromkeys
创建一个新字典,其中包含指定的键,且默认每个键对应的值都是None。
d = dict.fromkeys(["name", "age"])
print(d)
d = dict.fromkeys(["name", "age"], "(unknown)")
print(d)
运行结果:
{'name': None, 'age': None}
{'name': '(unknown)', 'age': '(unknown)'}
3.4 get
通常,使用[键]的方式访问字典中没有的项,将会引发错误。而用get方法来访问不存在的键时,不会引发异常,而是返回None,若指定默认值,这样将返回指定的默认值而不是None。
x = {"username": "admin", "machines": ["foo", "bar", "baz"]}
print(x.get("username", "N/A"))
print(x.get("addr"))
print(x.get("addr", "N/A"))
运行结果:
admin
None
N/A
3.5 items
返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式。该列表属于特殊类型字典视图,这只是底层字典的反映,而不是复制。
d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
it = d.items()
print(it)
print(len(it))
print(("spam", 0) in it)
d["spam"] = 1
print(("spam", 0) in it)
运行结果:
dict_items([('title', 'Python Web Site'), ('url', 'http://www.python.org'), ('spam', 0)])
3
True
False
3.6 keys
返回一个字典试图,其中包含指定字典中的键。
>>> d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
>>> d.keys()
dict_keys(['title', 'url', 'spam'])
3.7 pop
获取与指定键相关联的值,并将该键-值对从字典中删除。
>>> d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
>>> d
{'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> d.pop("title")
Python Web Site
>>> d
{'url': 'http://www.python.org', 'spam': 0}
3.8 popitem
随机的弹出一个字典项,因为字典项的顺序是不确定的,没有“最后一个元素”的概念。
>>> d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
>>> 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'}
3.9 updata
使用一个字典中的项来更新另一个字典。
>>> d = {"title": "Python Web Site", "url": "http://www.python.org", "spam": 0}
>>> d
{'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> x = {"title": "Python Language Website"}
>>> d.update(x)
>>> d
{'title': 'Python Language Website', 'url': 'http://www.python.org', 'spam': 0}
3.10 values
返回一个由字典中的值组成的字典试图。
>>> x = {"username": "admin", "machines": ["foo", "bar", "baz"]}
>>> x.values()
dict_values(['admin', ['foo', 'bar', 'baz']])