专业人士笔记”系列目录:
创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!Dictionary字典介绍
字典是键值存储的一个例子,在Python中也称为映射。它允许您通过引用键来存储和检索元素。由于字典是按键引用的,所以查找速度非常快。由于它们主要用于按键去索引所有的值,所以不进行排序
创建一个字典
字典可以以多种方式初始化:
d = {}
#建一个空的字典
d = {'key': 'value'}
#新建一个字典并初始化值
#直接从另外一个字典copy过来并初始化是可行的,语法:
d = {**otherdict}
#也可以同时利用几个字典组合组成新的字典
d = {**otherdict, **yetanotherdict}
修改字典
要将项添加到字典中,只需创建一个带有值的新键即可:
d['newkey'] = 42
也可以将list和dictionary作为值添加
d['new_list'] = [1, 2, 3]
d['new_dict'] = {'nested_dict': 1}
要删除项,可以用del关键字从字典中删除键 :
del d[‘newkey’]
避免KeyError异常
使用字典时一个常见的陷阱是访问一个不存在的键。这通常会导致一个KeyError异常
mydict = {} #这是一个空字典
mydict['not there']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'not there'
避免键错误的一种方法是使用dict.get方法,该方法允许您指定一个默认值,以便在没有这个键的情况下返回。
value = mydict.get(key, default_value)
如果存在所需要获取的key,则返回mydict[key]的值,否则返回默认值。注意,这并没有向mydict添加密钥。如果你想存储键值对,你应该使用mydict.setdefault(键,默认值),它存储键值对。
mydict = {}
print(mydict)
#{}
print(mydict.get("foo", "bar"))
#bar 注意,这里返回了默认值
print(mydict)
#{} 仍然是空字典
print(mydict.setdefault("foo", "bar"))
#bar
print(mydict)
#使用setdefault方法存储了键值对 {'foo': 'bar'}
处理此问题的另一种方法是捕获异常 :
try:
value = mydict[key]
except KeyError:
value = default_value
还可以提前检查键是否在字典中 :
if key in mydict:
value = mydict[key]
else:
value = default_value
但是,请注意,在多线程环境中,在您进行检查时,可能会有其它线程从字典中删除键,从而创建一个仍然可以抛出异常的程序。另一种选择是使用dict的子类collections.defaultdict(下文会讲解),它会在给定新键时在dict中创建新条目。
迭代字典
如果您使用字典迭代器(例如在for语句中),它将遍历字典的键。例如
d = {'a': 1, 'b': 2, 'c':3}
for key in d:
print(key, d[key])
# c 3
# b 2
# a 1
当用于行表达式时也是如此:
print([key for key in d])
# ['c', 'b', 'a']
items()方法可用于同时循环键和值
for key, value in d.items():
print(key, value)
# c 3
# b 2
# a 1
而values()方法可以像预期的那样,只对值进行迭代
for key, value in d.values():
print(key, value)
#3
#2
#1
有默认值的字典
标准库中可用 : defaultdict
from collections import defaultdict
d = defaultdict(int)
d['key']
# 默认是 0
d['key'] = 5
d['key']
#输出:5
d = defaultdict(lambda: 'empty')
d['key']
#输出:'empty'
d['key'] = 'full'
d['key']
#默认值被覆盖 输出'full'
另外,如果您必须使用内置的dict类,那么使用dict.setdefault()将允许您在访问以前不存在的键时创建一个默认值
d = {}
print(d)
#输出 {}
d.setdefault('Another_key', []).append("This worked!")
print(d)
#输出:{'Another_key': ['This worked!']}
请记住,如果您要添加许多值,dict.setdefault()将在每次调用初值时创建一个新实例,这可能会创建不必要的工作负载
合并字典
考虑下面的字典:
fish = {'name': "Nemo", 'hands': "fins", 'special': "gills"}
dog = {'name': "Clifford", 'hands': "paws", 'color': "red"}
赋值:
fishdog = {**fish, **dog}
print(fishdog)
#输出:
{'hands': 'paws', 'color': 'red', 'name': 'Clifford', 'special': 'gills'}
正如这个例子所演示的,复制的键后面的会覆盖前的值(例如“Clifford”覆盖“Nemo”)
同样的写法还有如下:
fish.update(dog)
print(fish)
#输出:{'color': 'red', 'hands': 'paws', 'name': 'Clifford', 'special': 'gills'}
访问键和值
在使用字典时,通常需要访问字典中的所有键和值
给定一个字典:
mydict = {
'a': '1',
'b': '2'
}
可以使用keys()方法获得key列表
print(mydict.keys())
# Python2: ['a', 'b']
# Python3: dict_keys(['b', 'a'])
如果想要一个值列表,那么使用values()方法
print(mydict.values())
# Python2: ['1', '2']
# Python3: dict_values(['2', '1'])
如果希望同时使用键和键对应的值,可以使用items()方法 :
print(mydict.items())
# Python2: [('a', '1'), ('b', '2')]
# Python3: dict_items([('b', '2'), ('a', '1')])
注意:因为dict是未排序的,所以键、值没有排序顺序。如果您关心这些方法返回的顺序,可以使用sort()、ordered()或OrderedDict。
访问字典的值
dictionary = {"Hello": 1234, "World": 5678}
print(dictionary["Hello"]) #输出:1234
本例中的字符串“Hello”被称为键。它用于通过将键放在方括号中来查找dict中的值。
在dict定义中,数字1234出现在相应的冒号之后。在这个dict中,它被称为“Hello”映射到的值。
创建有顺序的字典
默认字典是无序的,当然你可以创建一个有序的字典,它在遍历字典中的键时遵循一个确定的顺序。使用来自collections模块的OrderedDict。当迭代遍历时,总是以原始插入顺序返回dictionary元素。
from collections import OrderedDict
d = OrderedDict()
d['first'] = 1
d['second'] = 2
d['third'] = 3
d['last'] = 4
for key in d:
print(key, d[key])
#输出 "first 1", "second 2", "third 3", "last 4"
使用“ ** ” 操作字典
可以使用**关键字操作符将字典中的键-值对传递到函数的参数中。官方文档中的一个简化示例 :
def parrot(voltage, state, action):
… print("This parrot wouldn't", action, end=' ')
… print("if you put", voltage, "volts through it.", end=' ')
… print("E's", state, "!")
…
d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
parrot(**d)
该操作符即可以合并字典,见前面的“合并字典”章节
带着逗号的小尾巴
与列表和元组一样,您可以在字典中包含一个尾随逗号 ,其并不会影响字典的值
role = {"By day": "A typical programmer",
"By night": "Still a typical programmer", }
print(role)
#输出:{'By day': 'A typical programmer', 'By night': 'Still a typical programmer'}
和之前的值一样,其中的逗号其实是个逗比、打酱油的,不影响值
dict() 构造函数
dict()构造函数可用于从关键字参数创建字典,或从键-值对的单个迭代器创建字典,或从单个字典和关键字参数创建字典:
dict(a=1, b=2, c=3)
# {'a': 1, 'b': 2, 'c': 3}
dict([('d', 4), ('e', 5), ('f', 6)])
# {'d': 4, 'e': 5, 'f': 6}
dict([('a', 1)], b=2, c=3)
# {'a': 1, 'b': 2, 'c': 3}
dict({'a' : 1, 'b' : 2}, c=3)
# {'a': 1, 'b': 2, 'c': 3}
字典值的所有组合值
options = {
"x": ["a", "b"],
"y": [10, 20, 30]
}
给定一个类似于上面所示的字典,其中有一个列表,它表示一组值,以便查找对应的键。假设您希望探索“x”=“a”和“y”=10,然后“x”=“a”和“y”=20,以此类推,直到您探索了所有可能的组合。
您可以使用以下代码创建一个返回所有这些值组合的列表。
import itertools
options = {
"x": ["a", "b"],
"y": [10, 20, 30]}
keys = options.keys()
values = (options[key] for key in keys)
combinations = [dict(zip(keys, combination)) for combination in itertools.product(*values)]
print combinations
#输出:
[{'x': 'a', 'y': 10},
{'x': 'b', 'y': 10},
{'x': 'a', 'y': 20},
{'x': 'b', 'y': 20},
{'x': 'a', 'y': 30},
{'x': 'b', 'y': 30}]
补充:ZIP函数
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
好了,今天的分享就到这里,禁止转载,违者必究