60D5 – dict 和 set 基本操作、字典视图等 6 个方面的总结

字典

字典(dict),一种映射对象(mapping)类型,键值对的容器。

五种创建方法

创建 dict 的方法很简单,使用一对中括号 { } ,键值对中间用冒号,每项间使用逗号进行分割。

1、手动创建

empty = {}
dic = {'a':1,'c':3,'e':5}

2. 使用 dict() 构造函数

In [10]: dict(a=1,b=2,c=3)
Out[10]: {'a': 1, 'b': 2, 'c': 3}

3. 键值对 + 关键字参数

第一个参数为字典,后面是一系列关键字的参数,如 c=3 :

In [9]: dict({'a':1,'b':2},c=3,d=4)
Out[9]: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

4. 可迭代对象

列表,元素又为一个元组,后面再加一系列关键字参数。

In [8]: dict([('a',1),('b',2)],c=3)
Out[8]: {'a': 1, 'b': 2, 'c': 3}

5. fromkeys() 方法

已知键集合(keys),values 为初始值:

In [7]: {}.fromkeys(['k1','k2','k3'],[1,2,3])
Out[7]: {'k1': [1, 2, 3], 'k2': [1, 2, 3], 'k3': [1, 2, 3]}

In [14]: {'a':1,'b':2}.fromkeys(['c','d'],[1,2])
Out[14]: {'c': [1, 2], 'd': [1, 2]}

基本操作

  • 创建字典
  • 遍历字典
  • 获取所有键集合(keys)
  • 获取所有值集合(values)
  • 获取某键对应的值
  • 添加、修改或删除一个键值对

创建字典 d:

In [2]: d = {'a':1,'b':2,'c':3}

字典属于容器,遍历容器每一项:

In [3]: for key, val in d.items():
   ...:     print(key,val)

结果:

a 1
b 2
c 3

获取所有键集合:

# 方法 1
In [4]: set(d)
Out[4]: {'a', 'b', 'c'}
# 方法 2
In [6]: set(d.keys())
Out[6]: {'a', 'b', 'c'}

获取所有值集合:

In [7]: set(d.values())
Out[7]: {1, 2, 3}

判断键是否在字典中:

# 判断键 c 在 d 中?
In [8]: if 'c' in d:
   ...:     print('键c在字典d中')
键c在字典d中

# 判断键 c 不在 d 中?
In [9]: if 'e' not in d:
   ...:     print('键e不在字典d中')
键e不在字典d中

获取某键对应的值:

In [10]: d.get('c')
Out[10]: 3

添加或修改一个键值对:

In [11]: d['d'] = 4
    ...: print(d) 
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

删除一个键值对:

# 方法 1
In [12]: del d['d']
    ...: print(d)
{'a': 1, 'b': 2, 'c': 3}

# 方法 2
In [13]: d.pop('c') # 返回 3
    ...: print(d) 
{'a': 1, 'b': 2}

字典视图

字典自带的三个方法 d.items()d.keys()d.values(),分别返回如下对象:

In [14]: d = {'a': 1, 'b': 2, 'c': 3}
In [15]: d.keys()
Out[15]: dict_keys(['a', 'b', 'c'])

In [16]: d.values()
Out[16]: dict_values([1, 2, 3])

In [17]: d.items()
Out[17]: dict_items([('a', 1), ('b', 2), ('c', 3)])

它们都是原字典的视图,修改原字典对象,视图对象的值也会发生改变。

a = {'a':1, 'b':2, 'c':3}
key_lst = a.keys() # 创建字典的键集合视图

删除键 b,视图对象 key_lst 值也发生改变。

items(),也是返回一个视图对象:

a = {'a':1, 'b':2, 'c':3}
items = a.items()

修改字典,可看到视图对象 items 的值也会改变:

a['c']=4

字典的键

所有对象都能作为字典的键吗?
如果一个列表对象 lst 试图作为字典的键,会出现什么问题。
实验一下:

In [1]: lst = [1,2]
In [2]: d = {lst:'ok?'}

TypeError: unhashable type: 'list'

会抛出如上 TypeError 异常:不可哈希的类型 list。

hashable(可哈希性)
An object is hashable if it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __eq__()or __cmp__() method).
Hashable objects which compare equal must have the same hash value.

因为列表是可变对象,而可变对象是不可哈希的,所以会抛出如上异常。

结论:可哈希的对象才能作为字典的键,不可哈希的对象不能作为字典的键。

页面: 1 2 3

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注