dict字典定义
字典由键及其相应的值组成,这种键值对称为项(item)。
键和值之间用冒号(:)分隔,项之间用逗号分隔,整个字典放在花括号内
people = {‘name’:‘Sudley’,‘age’:99}
在字典(以及其他映射类型)中,键必须是独一无二的。
dict字典创建
>>> items = [('name','Sudley'),('age',99)]
>>> d = dict(items)
>>> d
{'name': 'Sudley', 'age': 99}
>>> d2 = dict(name='Sudley',age=99)
>>> d2
{'name': 'Sudley', 'age': 99}
>>>
将两个列表合成一个字典
>>> lst1 = ['name','age']
>>> lst2 = ['Sudley',99]
>>> d = dict(zip(lst1,lst2))
>>> d
{'name': 'Sudley', 'age': 99}
>>>
基本的字典操作
- len(d)返回字典的items数
- d[k] 返回与键k相关联的值
- d[k] = v 将值v关联到键k
- del d[k] 删除键k的项
- k in d 检查字典d是否包含键为k的项
字典和列表的主要区别
对比项 | 字典 | 列表 |
---|---|---|
键VS索引 | 键可以是任何不可变的类型,如整数、浮点数(实数)、字符串或元组 | 索引是整数 |
自动添加 | 对原来没有的键赋值会新建一个项 | 无法直接对不存在的索引赋值,需要借助append等方法新增元素 |
成员资格(k in d) | 查找的是键而非值 | 查找的是值而非索引 |
字典的方法
方法 | 描述 |
---|---|
d.clear() | 删除d的所有项 |
d.copy() | 返回d的副本,执行的是浅复制 |
d.fromkeys(seq[, val]) | 返回一个字典,其中的键来自seq,而值都被设置为val(默认为None)。可直接使用字典类型dict将其作为类的方法来调用 |
d.get(key[, default]) | 若d[key]存在,就返回它的值;否则返回指定的默认值(默认为None) |
d.items() | 返回一个包含d各项(key,value)对的迭代器(视图) |
d.iterkeys() | 返回一个可用于对d的键进行迭代的迭代对象 |
d.keys() | 返回一个包含所有键的迭代器(视图) |
d.pop(key[, d]) | 删除并返回对应键的值,若键不存在且设置了d则返回给定默认值d,若键不存在也没设置d则引发KeyError异常 |
d.popitem() | 随机删除一个项,并以(key,value)对的方式返回 |
d.setdefault(key[, default]) | 如果d[key]存在,就返回它的值;否则返回指定的默认值(默认为None),并将d[key]设置为指定的默认值 |
d.update(other) | 将other中的每项都添加到d(可能覆盖既有的项)。也可以像调用字典构造函数那样指定类似的参数 |
d.value() | 返回一个迭代器(视图),其中包含d中所有的值(可能有重复的) |
方法举例
1.clear
>>> x = {'key':'value'}
>>> y = x
>>> y
{'key': 'value'}
>>> x = {}
>>> y
{'key': 'value'}
>>> x = {'key':'value'}
>>> y = x
>>> y
{'key': 'value'}
>>> x.clear() #注意这里没有返回值,或者说返回None
>>> y
{}
>>>
2.copy
执行的是浅复制,当替换副本中的值时,原件不受影响。如果修改副本中的值(就地修改而不是替换),原件也将发生改变。
浅复制相关概念可参考
【Python基础9】浅谈深浅拷贝及变量赋值
>>> x = {'username':'admin','machines':['foo','bar','baz']}
>>> y = x.copy()
>>> y['username'] = 'root'
>>> y['machines'].remove('bar')
>>> y
{'username': 'root', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}
>>> y['machines'][0] = 'bar'
>>> y
{'username': 'root', 'machines': ['bar', 'baz']}
>>> x
{'username': 'admin', 'machines': ['bar', 'baz']}
>>> y['machines'] = 'bar'
>>> y
{'username': 'root', 'machines': 'bar'}
>>> x
{'username': 'admin', 'machines': ['bar', 'baz']}
>>>
为了避免上述的问题可以执行深复制,即同时复制值及其包含的所有值,等等。
>>> from copy import deepcopy
>>> x = {'username':'admin','machines':['foo','bar','baz']}
>>> y = deepcopy(x)
>>> y['machines'].remove('bar')
>>> y
{'username': 'admin', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>>
3.fromkeys
>>> dict.fromkeys(['name','age'])
{'name': None, 'age': None}
>>> dict.fromkeys(['name','age'],'NA')
{'name': 'NA', 'age': 'NA'}
>>>
4.get
>>> d = {}
>>> d['name']
Traceback (most recent call last):
File "<pyshell#41>", line 1, in <module>
d['name']
KeyError: 'name'
>>> d.get('name')
>>> d
{}
>>>
5.setdefault
>>> d = {}
>>> d.setdefault('name')
>>> d
{'name': None}
>>> d.setdefault('age','NA')
'NA'
>>> d
{'name': None, 'age': 'NA'}
>>>
6.items
>>> x = {'username':'admin','machines':['foo','bar','baz']}
>>> x.items()
dict_items([('username', 'admin'), ('machines', ['foo', 'bar', 'baz'])])
>>> y = x.items()
>>> y[0]
Traceback (most recent call last):
File "<pyshell#57>", line 1, in <module>
y[0]
TypeError: 'dict_items' object is not subscriptable
>>> print(y)
dict_items([('username', 'admin'), ('machines', ['foo', 'bar', 'baz'])])
>>> for i in y: #返回值y属于一种名为字典视图的特殊类型,可用于迭代但是不能索引
print(i)
('username', 'admin')
('machines', ['foo', 'bar', 'baz'])
>>>
7.keys
和上面一样可以迭代不能索引,字典是无序的。
>>> x = {'username':'admin','machines':['foo','bar','baz']}
>>> x.keys()
dict_keys(['username', 'machines'])
>>>
8.pop
>>> x = {'username':'admin','machines':['foo','bar','baz'],'ip':'xx'}
>>> x.pop() #必须带键值
Traceback (most recent call last):
File "<pyshell#68>", line 1, in <module>
x.pop()
TypeError: pop expected at least 1 arguments, got 0
>>> x.pop('ip')
'xx'
>>> x.pop('ip')
Traceback (most recent call last):
File "<pyshell#70>", line 1, in <module>
x.pop('ip')
KeyError: 'ip'
>>> x.pop('ip','ip?')
'ip?'
>>>
9.popitems
>>> x = {'username':'admin','machines':['foo','bar','baz'],'ip':'xx'}
>>> x.popitem() #随机弹出一个项
('ip', 'xx')
>>> x.popitem()
('machines', ['foo', 'bar', 'baz'])
>>>
10.update
>>> d = {
'username':'root',
'ip':'192.168.1.1',
'tty':'1'}
>>> x = {'username':'guest','tty':'2'}
>>> d.update(x)
>>> d
{'username': 'guest', 'ip': '192.168.1.1', 'tty': '2'}
>>> y = {'username':'guest','http':'2'}
>>> d.update(y)
>>> d
{'username': 'guest', 'ip': '192.168.1.1', 'tty': '2', 'http': '2'}
>>>