python基础学习-字典
概念
字典,也称映射(mapping)是一种可通过名称来访问其各个值的数据结构。字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。字典是key-value键值对的数据的集合,它是可变的、无序的、key不重复。字典中的item指的就是kv对
字典(日常生活中的字典和Python字典)旨在让你能够轻松地找到特定的单词(键),以获悉其定义(值) 。
Python字典的用途:
表示棋盘的状态,其中每个键都是由坐标组成的元组;
存储文件修改时间,其中的键为文件名;
数字电话/地址簿。
不要用值来找,要用key来找。如果需要用值来找就不要用此种方法
1 | 'Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl'] names = [ |
基本的字典操作
1 | len(d) |
字典dict定义,初始化
d = dict() 或者 d = {}
dict(**kwargs) 使用name = value对初始化一个字典
dict(iterable,**kwarg) 使用可迭代对象和name = value对构造字典,不过可迭代对象的元素必须是一个二元结构
- d = dict(((1,’a’),(2,’b’))) 或者 d = dict(([1,’a’],[2,’b’]))
dict(mapping,**kwarg) 使用一个字典构建另一个字典
d = {‘a’:10,’b’:20,’c’:None,’d’:[1,2,3]}
类方法 dict.fromkeys(iterable,value)
- d = dict.fromkeys(range(5))
- d = dict.fromkeys(range(5),0)
键的类型:字典中的键可以是整数,但并非必须是整数。字典中的键可以是任何不可变的类型,如浮点数(实数) 、字符串或元组。
自动添加:即便是字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。然而,如果不使用append或其他类似的方法,就不能给列表中没有的元素赋值。
成员资格:表达式k in d(其中d 是一个字典)查找的是键而不是值,而表达式v in l(其中l是一个列表)查找的是值而不是索引。这看似不太一致,但你习惯后就会觉得相当自然。毕竟如果字典包含指定的键,检查相应的值就很容易。
相比于检查列表是否包含指定的值,检查字典是否包含指定的键的效率更高。数据结构越大,效率差距就越大。
1 | # 创建与使用 |
类与函数调用
1 | l1 = list() |
字典元素的访问
- d[key]
- 返回key对应的值value
- key不存在抛出KeyError异常
- get(key[,default])
- 返回key对应的值value
- get方法不会抛异常,如果key不存在,返回缺省值,如果没有设置缺省值就返回None。如果存在,就显示其值。
1 | # 方法get为访问字典项提供了宽松的环境。通常,如果你试图访问字典中没有的项,将引发错误。 |
- setdefault(key[,default])
- 返回key对应的值value
- key不存在,添加kv对,value为default,并返回default,如果default没有设置,缺省为None
1 | # 方法setdefault 有点像 get,因为它也获取与指定键相关联的值,但除此之外,setdefault还在字典不包含指定的键时,在字典中添加指定的键值对。 |
字典增加和修改
- d[key] = value
- 将key对应的值修改为value
- key不存在添加新的kv对
- update([other]) -> None
- 使用另一个字典的kv对更新本字典
- key不存在,就添加
- key存在,覆盖已经存在的key对应的值
- 就地修改
- d.update(red=1)
- d.update(((‘red’,2),))
- d.update({‘red’:3})
1 | # 方法update使用一个字典中的项来更新另一个字典。 |
- copy(返回一个新字典)
1 | # 方法copy返回一个新字典,其包含的键值对与原来的字典相同(这个方法执行的是浅复制,因为值本身是原件,而非副本)。 |
- fromkeys(创建新字典)
1 | # fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None。 |
字典删除
pop(key[,default])
- key存在,移除它,并返回它的value
- key不存在,返回给定的default
- default未设置,key不存在则抛出KeyError异常
1 | # 方法pop可用于获取与指定键相关联的值,并将该键值对从字典中删除。 |
popitem()
- 移除并返回一个任意的键值对
- 字典为empty,抛出KeyError异常
1 | # 方法popitem类似于list.pop ,但 list.pop弹出列表中的最后一个元素,而popitem随机地弹出一个字典项, |
clear()
- 清空字典
- 就地修改
1 | # clear(删除所有字典项) |
- del语句
1 | a = True |
字典遍历
- 遍历key,方法keys返回一个字典视图,其中包含指定字典中的键。
1 | Method: |
- 遍历value
1 | Method: |
- 遍历item,即kv对
1 | Method: |
- 总结
- Python3中,keys、values、items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中
- Dictionary view对象
- 字典的entry的动态的视图,字典变化,视图将反映出这些变化
- Python2中,上面的方法会返回一个新的列表,占据新的内存空间。所以Python2建议使用iterkeys、itervalues、iteritems版本,返回一个迭代器,而不是一个copy
- Python3中,keys、values、items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中
字典遍历和移除
- 如何在遍历的时候移除元素
1 | 错误的做法 |
字典的key
- key的要求和set的元素要求一致
- set的元素可以看做key,set可以看做dict的简化版
- hashable可哈希才可以作为key,可以使用hash()测试。可hash的类型是不可变的,可变类型是不可hash的
1 | d = {1:0,2.0:3,"abc":None,('hello','world','python'):"string",b'abc':'135'} |
defaultdict
collections.defaultdict([default_factory[,…]])
- 第一个参数是default_factory,缺省是None,它提供一个初始化函数。当key不存在的时候,会调用这个工厂函数来生成key对应的value
1 | 例: |
OrderedDict
collections.OrderedDict([items])
- key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序
有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印
3.6版本的Python的字典就是记录key插入的顺序(IPython不一定有效果)
应用场景
- 假如使用字典记录了N个产品,这些产品使用ID由小到大加入到字典中
- 除了使用字典检索的遍历,有时候需要取出ID,但是希望是按照输入的顺序,因为输入顺序是有序的
- 否则还需要重新把遍历到的值排序
1 | from collections import OrderedDict |