字典的创建
1.使用大括号直接创建
2.使用dict()函数创建
3.以列表作为元素创建
4.大括号与dict()函数混合创建
5.在dict()函数中利用zip()函数创建
>>> a = {'吕布': '战神', '关羽': '武圣', '刘备': '老大哥'}
>>> b = dict(吕布='战神',关羽='武圣',刘备='老大哥')#注意,dict()函数中,键不可加引号
>>> c = dict([('吕布','战神'),('关羽','武圣'),('刘备','老大哥')])
>>> d = dict({"吕布":"战神","关羽":"武圣"},刘备='老大哥')
>>>e = dict(zip(["吕布","关羽","刘备"],["战神","武圣","老大哥"]))
>>> a == b == c == d == e
True
fromkeys()函数可以在值相同的情况下快速生成一个字典。
>>> x = dict.fromkeys('Fish',123)
>>> x
{'F': 123, 'i': 123, 's': 123, 'h': 123}
>>> x['F'] = 456
>>> x
{'F': 456, 'i': 123, 's': 123, 'h': 123}
增
在末尾添加一个键值对
>>> x['C'] = 789
>>> x
{'F': 456, 'i': 123, 's': 123, 'h': 123, 'C': 789}
删
pop()函数返回指定键的值并在字典中删除该键值对。
>>> x.pop('s')
123
>>> x
{'F': 456, 'i': 123, 'h': 123, 'C': 789}
>>> x.pop('狗') #没有的元素会抛出异常
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
x.pop('狗')
KeyError: '狗'
>>> x.pop('狗','没有')#可以加个'没有'来避免抛出异常
'没有'
popitem()函数python3.7之后删除最后一个键值对,3.7版本之前是随机删除一个键值对。
>>> x.popitem()
('C', 789)
>>> x
{'F': 456, 'i': 123, 'h': 123}
del关键字可以删除指定元素,也可以删除整个字典。
>>> del x['i']
>>> x
{'F': 456, 'h': 123}
>>> del x
>>> x
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
x
NameError: name 'x' is not defined
clear()函数清空字典。
>>> y = dict.fromkeys('FishC',123)
>>> y
{'F': 123, 'i': 123, 's': 123, 'h': 123, 'C': 123}
>>> y.clear()
>>> y
{}
改
指定某个元素利用赋值运算符修改其值。
>>> x = dict.fromkeys('FishC')
>>> x
{'F': None, 'i': None, 's': None, 'h': None, 'C': None}
>>> x['s'] = 123
>>> x
{'F': None, 'i': None, 's': 123, 'h': None, 'C': None}
update()函数同时修改多个键值对。
>>> x.update({'i':'124','h':'125'})
>>> x
{'F': None, 'i': '124', 's': 123, 'h': '125', 'C': None}
>>> x.update(F='70',C='20')
>>> x
{'F': '70', 'i': '124', 's': 123, 'h': '125', 'C': '20'}
查
相较于直接查询某个值,使用get方法可以避免报错。
>>> x['C']
'20'
>>> x['c']
Traceback (most recent call last):
File "<pyshell#50>", line 1, in <module>
x['c']
KeyError: 'c'
>>> x.get('c','这里没有c')
'这里没有c'
setdefault():如果查询的键存在就返回它的值,如果不存在就向末尾添加该键,且第二个参数为其值。
>>> x.setdefault('C','code')
'20'
>>> x.setdefault('c','code')
'code'
>>> x
{'F': '70', 'i': '124', 's': 123, 'h': '125', 'C': '20', 'c': 'code'}
items():获取键值对的视图对象。
keys():获取键的视图对象。
valuels():获取值的视图对象。
视图对象即字典的动态视图,这就意味着当字典的内容发生改变的时候,视图对象的内容也会相应地跟着改变。
>>> keys = x.keys()
>>> values = x.values()
>>> items = x.items()
>>> items
dict_items([('F', '70'), ('i', '124'), ('s', 123), ('h', '125'), ('C', '20'), ('c', 'code')])
>>> keys
dict_keys(['F', 'i', 's', 'h', 'C', 'c'])
>>> values
dict_values(['70', '124', 123, '125', '20', 'code'])
>>> x.pop('c')
'code'
>>> x
{'F': '70', 'i': '124', 's': 123, 'h': '125', 'C': '20'}
>>> items
dict_items([('F', '70'), ('i', '124'), ('s', 123), ('h', '125'), ('C', '20')])
>>> keys
dict_keys(['F', 'i', 's', 'h', 'C'])
>>> values
dict_values(['70', '124', 123, '125', '20'])
copy():浅拷贝。
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
>>> y = x.copy()
>>> y
{'F': '70', 'i': '124', 's': 123, 'h': '125', 'C': '20'}
len()查询有几个元素。
>>> len(x)
5
in
和not in
判断元素是否存在该字典内。
>>> 'C'in x
True
>>> 'c' not in x
True
把值以列表形式输出。
>>> list(x.values())
['70', '124', 123, '125', '20']
iter()函数生成迭代器,用next()逐个输出。
>> y = iter(x)
>>> next(y)
'F'
>>> next(y)
'i'
>>> next(y)
's'
>>> next(y)
'h'
>>> next(y)
'C'
python在3.8之前是字典无序的,在3.8之可以用reversed()函数倒序输出。
>>> list(reversed(x.values()))
['20', '125', 123, '124', '70']
嵌套
字典也可以作为值。
>>> x = {'吕布':{'语文':60,'数学':70,'英语':80},'关羽':{'语文':80,'数学':90,'英语':70}}
>>> x
{'吕布': {'语文': 60, '数学': 70, '英语': 80}, '关羽': {'语文': 80, '数学': 90, '英语': 70}}
>>> x['吕布']['数学']
70
列表作为值。
>>> x = {'吕布':[60,70,80],'关羽':[80,90,70]}
>>> x['吕布'][1]
70
字典推导式
>>> x = {'吕布':'战神','关羽':'武圣','刘备':'老大哥'}
>>> y = {m:n for n,m in x.items()}
>>> y
{'战神': '吕布', '武圣': '关羽', '老大哥': '刘备'}
>>> d = {'F':70,'i':105,'s':115,'h':104,'c':67}
>>> b = {v:k for k,v in d.items() if v > 100}
>>> b
{105: 'i', 115: 's', 104: 'h'}
>>> d = {x:ord(x) for x in 'FishC'}#ord函数计算编码值
>>> d
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'C': 67}
>>> d = {x:y for x in [1,3,5] for y in [2,4,6]}
>>> d#第一遍传入了1:2,1:4,1:6,最后覆盖只剩1:6,3:6,5:6,键唯一
{1: 6, 3: 6, 5: 6}