字典dict定义
字典是一种映射类型,字典用{}标识,它是一个无序的键(key) : 值(value)
的集合。
列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典可以用多种方式构建:
- 使用一对大括号表示空字典: {}
- 使用大括号,用逗号分隔的key:value对: {‘a’:1,‘b’:2}
- 使用类型构造函数: dict() 或 dict(iterable)
例如:
1
2
3
4
5
6
7
8
9
|
d1 = {'a':1,'b':2,'c':3} # 字典d1有三个元素,分别是键值对'a':1,键值对'b':2,键值对'c':3
d2 = {} # d2是空字典。
d3 = dict() # 构造函数生成空字典
d4 = dict(a=1,b=2,c=3) # 构造函数生成字典
print(d1)
print(d2)
print(d3)
print(d4)
|
执行以上程序会输出如下结果:
1
2
3
4
|
{'a': 1, 'b': 2, 'c': 3}
{}
{}
{'a': 1, 'b': 2, 'c': 3}
|
其中,用逗号分割的字典,最后一个逗号是可选的。
{‘a’:1,‘b’:2,‘c’:3} 和 {‘a’:1,‘b’:2,‘c’:3,}都是合法的字典。
构造函数dict()可以直接从键值对序列中构建字典如下:
1
2
|
>>>dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)])
{'Taobao': 3, 'Runoob': 1, 'Google': 2}
|
字典推导
除了上面介绍的方法生成字典外,还可以使用字典推导来生成字典。推导comprehensions(又称解析式),是Python的一种独有特性。推导是可以从一个数据序列构建另一个新的数据序列的结构体。 字典推导就是利用其他数据序列构建字典。
字典推导语法:
{ x:y for x,y in iterable if 条件}
其中if语句是可以省略的。
例如:
1
2
3
4
5
|
L = [(1,"a"),(2,"b"),(3,"c")]
d1 = {x:y for x,y in L}
d2 = {x:y for x,y in L if x < 3}
print(d1)
print(d2)
|
执行以上程序会输出如下结果:
1
2
|
{1: 'a', 2: 'b', 3: 'c'}
{1: 'a', 2: 'b'}
|
索引操作
字典支持索引来获取值,修改值或者添加键值对。
d[key]
返回key指定的值。如果键不在字典中,则引发keyError。
d[key] = value
将d[key]设置为value。
del d[key]
从d中删除d[key]。如果键不在字典中,则会引发KeyError。
例如:
1
2
3
4
5
6
7
8
|
d = {'name': 'jack', 'age': 22,1:100}
print(d) # 打印字典d
print(d['name']) # 输出键为 'name' 的值
print(d[1]) # 输出键为1的值
d['name'] = 'bruce' # 键为 'name' 的值修改为'bruce'
print(d) # 打印修改后的字典d
d[2] = 200 # 添加键值对2:200
print(d) # 打印添加键值对后的字典d
|
执行以上程序会输出如下结果:
1
2
3
4
5
|
{'name': 'jack', 'age': 22, 1: 100}
jack
100
{'name': 'bruce', 'age': 22, 1: 100}
{'name': 'bruce', 'age': 22, 1: 100, 2: 200}
|
引用不存在的key,会引发keyError异常。例如:
1
2
|
d = {'name': 'jack', 'age': 22, 1:100}
print(d[3]) # 不存在键为3的键值对,引发keyError。
|
错误如下
1
2
3
4
|
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(d[3]) #不存在键为3的键值对,引发keyError。
KeyError: 3
|
键(key)必须是可哈希的,也就是不可变类型。在同一个字典中,键(key)必须是唯一的。不可哈希的值,包括列表、字典或其他可变类型(按值而不是按对象标识进行比较)的值不能用作键。
d = {'name': 'jack', 'age': 22,['a']:100}
[‘a’]用作字典的键,报出以下错误。
1
2
3
|
Traceback (most recent call last):
File "main.py", line 1, in <module>
d = {'name': 'jack', 'age': 22,['a']:100} TypeError: unhashable type: 'list'
|
如果两个数字比较相等(如1和1.0),则可以互换使用它们来索引同一字典条目。(但是请注意,由于计算机将浮点数字存储为近似值,因此将它们用作字典键通常是不明智的。)
例如:
1
2
3
|
d = {1:100} # 字典d,有一个键值对1:100。
d[1.0] = 200 # 添加键值对1.0:200。 由于整数1和浮点数1.0的值是相等的,所以d[1]和d[1.0]指向同一个值。
print(d) # 结果是{1: 200}。
|
测试字典key是否存在。
key in d
d如果存在key,返回True,否则返回False。
key not in d
相当于not key in d.
1
2
3
4
5
|
d = {'name': 'jack', 'age': 22,1:100}
if 'name' in d:
print('字典d中存在name键')
else:
print('字典d中不存在name键')
|
要避免key不存在的错误,有两种办法,
一是通过in判断key是否存在:
二是通过dict提供的get方法,如果key不存在,可以返回None,或者指定的value:
d = {‘Michael’: 95, ‘Bob’: 75, ‘Tracy’: 85}
d.get(‘Bruce’) #字典d中不存在键为Bruce的键值对,结果为None
d.get(‘Thomas’, -1) #字典d中不存在键为Thomas的键值对,结果为-1
字典支持的方法
clear()
从字典中删除所有项,返回None。
例如:
1
2
3
|
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d1 = d.clear() # None
print(d) # 空字典{}
|
get(key[, default])
如果键在字典中,则返回键的值,否则为返回默认值default。如果未给定默认值default,则默认为None,因此不会引发KeyError。
items()
返回字典项(key, value) 视图。
例如:
1
2
3
4
5
|
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d1 = d.items() # 字典项(key, value) 视图
print(type(d1)) # 打印d1的类型
print(d1) # 打印的d1内容
print(d)
|
执行以上程序会输出如下结果:
1
2
3
|
<class 'dict_items'>
dict_items([('one', 1), ('two', 2), ('three', 3), ('four', 4)])
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
|
keys()
返回字典键的视图。
例如:
1
2
3
4
5
|
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d1 = d.keys() # 字典键视图
print(type(d1)) # 打印d1的类型
print(d1) # 打印的d1内容
print(d)
|
执行以上程序会输出如下结果:
1
2
3
|
<class 'dict_keys'>
dict_keys(['one', 'two', 'three', 'four'])
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
|
pop(key[, default])
如果键在字典中,则将其移除并返回其值。如果键不存在,返回默认值default。如果没有给定默认值,并且字典中没有键,则会引发KeyError。
例如:
1
2
3
4
5
6
7
8
9
10
|
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d1 = d.pop("one")
print(d1) #打印的d1内容
print(d)
d2 = d.pop("three",300)
print(d2) #打印的d2内容
print(d)
d3 = d.pop("Five",500)
print(d3) #打印的d3内容
print(d)
|
执行以上程序会输出如下结果:
1
2
3
4
5
6
|
1
{'two': 2, 'three': 3, 'four': 4}
3
{'two': 2, 'four': 4}
500
{'two': 2, 'four': 4}
|
以下程序会报错,引发KeyError。
1
2
|
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d1 = d.pop("Five") # 键"Five"不存在,并且没有给出默认值
|
错误信息如下。
1
2
3
4
|
Traceback (most recent call last):
File "main.py", line 2, in <module>
d1 = d.pop("Five")
KeyError: 'Five'
|
popitem()
从字典中删除并返回(key, value)对元组。按后进先出LIFO顺序返回。
例如:
1
2
3
4
5
6
7
8
9
|
d = {}
d["one"]=1
d["two"]=2
d["three"]=3
d["four"]=4
d1 = d.popitem()
print(type(d1)) # 打印的d1类型
print(d1) # 打印的d1内容
print(d)
|
执行以上程序会输出如下结果:
1
2
3
|
<class 'tuple'>
('four', 4)
{'one': 1, 'two': 2, 'three': 3}
|
(‘four’, 4)键值对是最后被添加的,按照LIFO原则,也是最先被删除的。
如果字典为空,则引发KeyError。
例如:
1
2
|
d = {}
d1 = d.popitem()
|
空字典报以下错误。
1
2
3
4
|
Traceback (most recent call last):
File "main.py", line 2, in <module>
d1 = d.popitem()
KeyError: 'popitem(): dictionary is empty'
|
setdefault(key[, default])
如果键在字典中,则返回其值。如果键不存在,则插入值为default的键值对,不存在default,则值为None。
例如:
1
2
3
4
5
6
7
8
9
10
|
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d1 = d.setdefault("one",100) #键"one"存在,返回其值1
print(d1) #打印的d1内容
print(d)
d2 = d.setdefault("five",5) #键"five"不存在,且给出了值5,添加键值对five:5
print(d2) #打印的d2内容
print(d)
d3 = d.setdefault("six") #键"six"不存在,且没有给出值,添加键值对six:None
print(d3) #打印的d3内容
print(d)
|
执行以上程序会输出如下结果:
1
2
3
4
5
6
|
1
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
5
{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}
None
{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': None}
|
update([other])
使用key/value对更新字典,覆盖现有键。返回值为None。update()接受另一个字典对象或key/value对的iterable(长度为2的元组或其他iterable)。如果指定了关键字参数,则字典将使用这些键/值对进行更新:d.update(red=1, blue=2).
例如:
1
2
3
4
5
6
7
8
9
|
d = {"one": 1, "two": 2, "three": 3, "four": 4}
l = [("one",11),("two",22)] #列表l有2个成员,每个成员都是长度为2的元组
d1 = d.update(l)
print(d1) #打印的d1内容
print(d)
d2 = {"five": 5}
d3 = d.update(d2)
print(d3) #打印的d3内容
print(d)
|
执行以上程序会输出如下结果:
1
2
3
4
|
None
{'one': 11, 'two': 22, 'three': 3, 'four': 4}
None
{'one': 11, 'two': 22, 'three': 3, 'four': 4, 'five': 5}
|
values()
返回字典值的视图。
例如:
1
2
3
4
5
|
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d1 = d.values() # 字典值视图
print(type(d1)) # 打印d1的类型
print(d1) # 打印的d1内容
print(d)
|
执行以上程序会输出如下结果:
1
2
3
|
<class 'dict_values'>
dict_values([1, 2, 3, 4])
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
|
只有当字典具有相同的(键、值)对时,字典才会比较相等。顺序比较(“<”、“<=”、“>=”、“>”)引发TypeError类型错误。
词典保留插入顺序。请注意,更新密钥不会影响顺序。删除后添加的键将插入到末尾。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}
>>> d
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> list(d)
['one', 'two', 'three', 'four']
>>> list(d.values())
[1, 2, 3, 4]
>>> d["one"] = 42
>>> d
{'one': 42, 'two': 2, 'three': 3, 'four': 4}
>>> del d["two"]
>>> d["two"] = None
>>> d
{'one': 42, 'three': 3, 'four': 4, 'two': None}
|
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
set集合和字典类似,一组key的集合,但不存储value。由于key不能重复set中没有重复值。
转载请注明本网址。