dict
什么是dict
dict,字典,组成元素为键值对。花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可。最后一个 key: value 的逗号可以省略。下面的代码是一个例子:
d = {'Naruto' : 12, 'Sasuke' : 13 , 'Sakura' : 12}
print(d)
输出如下:
{'Naruto': 12, 'Sasuke': 13, 'Sakura': 12}
可以简单地使用 d[key]
的形式,来查找对应的 value
,这和 list
很像。不同之处是,list
必须使用索引返回对应的元素,而dict
使用key
,下面的代码是一个例子:
print(d['Naruto'])
输入如下:
12
通过key
访问 dict
的value
,只要 key
存在,dict
就返回对应的value
。如果key
不存在,会直接报错:KeyError
。
要避免 KeyError 发生,有两个办法:一是先判断一下 key 是否存在,用 in 操作符:
if 'Naruto' in d:
print(d['Naruto'])
输出如下:
12
二是使用dict本身提供的一个 get 方法,在Key不存在的时候,返回None:
print(d.get('Naruto'))
print(d.get('Kakashi'))
输出如下:
12
None
字典特点
- 查找速度快。无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度,随着元素增加而逐渐下降。
- dict的缺点是占用内存大,还会浪费很多内容;list正好相反,占用内存小,但是查找速度慢。
- 在一个dict中,key不能重复。
- 存储的key-value序对是没有顺序的,dict内部是无序的,不能用dict存储有序的集合。
- 作为 key 的元素必须不可变。Python的基本类型如字符串、整数、浮点数都是不可变的,都可以作为 key。但是list是可变的,就不能作为 key。
添加新元素
dict是可变的,也就是说,可以随时往dict中添加新的 key-value。比如已有dict:
d = {'Naruto' : 12, 'Sasuke' : 13 , 'Sakura' : 12}
要把Kakashi的年龄32加进去,输入下面代码:
d['Kakashi'] = 32
查看d:
printO(d)
输出如下:
{'Naruto': 12, 'Sasuke': 13, 'Sakura': 12, 'Kakashi': 32}
字典遍历
直接用for
循环可以遍历dict
的key
:
d = {'Naruto': 12, 'Sasuke': 13, 'Sakura': 12, 'Kakashi': 32}
for key in d:
print(key)
输出如下:
Naruto
Sasuke
Sakura
Kakashi
迭代dict的value
dict对象本身就是可迭代对象,用 for 循环直接迭代 dict,可以每次拿到dict的一个key。
dict 对象有一个 values() 方法。此方法把dict转换成一个包含所有value的list。这样,迭代的就是 dict的每一个value:
d = {'Naruto': 12, 'Sasuke': 13, 'Sakura': 12, 'Kakashi': 32}
print(d.values())
输出如下:
dict_values([12, 13, 12, 32])
输入如下:
for v in d.values():
print(v)
输出如下:
12
13
12
32
迭代
可以通过for
循环来遍历list
或tuple
,这种遍历称为为迭代Iteration
。迭代是通过 for ... in
来完成的。Python
的 for
循环不仅可以用在list
或tuple
上,还可作用在其他可迭代对象上。迭代与按下标访问数组最大的不同是:后者是一种具体的迭代实现方式,而前者只关心迭代结果,根本不关心迭代内部是如何实现的。
dict 对象的 items() 方法返回的值:
d = {'Naruto' : 12, 'Sasuke' : 13 , 'Sakura' : 12}
print(d.items())
输出如下:
dict_items([('Naruto', 12), ('Sasuke', 13), ('Sakura', 12)])
上述代码中,items()
方法把``dict对象转换成了包含
tuple的
list。对
list进行迭代,可以同时获得
key和
value`:
for key, value in d.items():
print(key, ':', value)
输出如下:
Naruto : 12
Sasuke : 13
Sakura : 12
索引迭代
迭代永远是取出元素本身,而非元素的索引。想在 for
循环中拿到索引,方法是使用 enumerate()
函数:
d = {'Naruto' : 12, 'Sasuke' : 13 , 'Sakura' : 12}
for index , name in enumerate(d):
print(index, ':', name)
输出如下:
0 : Naruto
1 : Sasuke
2 : Sakura
enumerate()
函数把:[‘Naruto’, ‘Sasuke’, ‘Sakura’]
变成了类似:[(0, 'Naruto'), (1, 'Sasuke'), (2, 'Sakura' )]
,输入如下:
for a in enumerate(d):
print(a)
输出如下:
(0, 'Naruto')
(1, 'Sasuke')
(2, 'Sakura')
迭代的每一个元素实际上是一个tuple
:
for t in enumerate(d):
index = t[0]
name = t[1]
print(index, '-', name)
输出如下:
0 - Naruto
1 - Sasuke
2 - Sakura
zip()
函数可以将两个list
变成一个list
:
d = zip([1, 2, 3], ['A','B','C'])
for i in d:
print(i)
set
由于set
存储的是无序集合,所以无法通过索引来访问。访问 set中的某个元素实际上就是判断一个元素是否在set中。set存储的元素和dict的key类似,必须是不变对象。
例如,存储了班里同学名字的set:
s = set(['Naruto', 'Sasuke', 'Sakura'])
用 in
操作符判断,Naruto
是火影里的人物吗:
'Naruto' in s
输出如下:
True
集合set的元素没有重复,而且是无序的。创建 set 的方式是调用 set() 并传入一个 list,list的元素将作为set的元素:
s = set([1, 2, 3])
s
输出如下:
{1, 2, 3}
set不能包含重复的元素。传入包含重复元素的 list
会怎么样呢?set
会自动去掉重复的元素:
s = set(['A', 'B', 'C', 'C'])
print(s)
输出如下:
{'C', 'A', 'B'}
add
由于set存储的是一组不重复的无序元素,因此,更新set主要做两件事:一是把新的元素添加到set中,二是把已有元素从set中删除。
添加元素时,用set的add()方法。如果添加的元素已经存在于set中,add()不会报错,但是不会加进去:
s = set([1, 2, 3])
s.add(4)
print(s)
输出如下:
{1, 2, 3, 4}
remove
删除set中的元素。如果删除的元素不存在set中,remove()会报错:
s = set([1, 2, 3, 4])
s.remove(3)
s
输出如下:
{1, 2, 4}
用add()可以直接添加,而remove()前需要判断。
遍历
由于 set 也是一个集合,所以,遍历 set 和遍历 list 类似,都可以通过 for 循环实现。直接使用 for 循环可以遍历 set 的元素:
s = set(['A', 'B', 'C', 'C'])
for i in s:
print(i)
输出如下:
C
A
B
注意: 观察 for 循环在遍历set时,元素的顺序和list的顺序很可能是不同的,而且不同的机器上运行的结果也可能不同。