字典
字典的实现原理:
和查字典类似,当我们在字典中查找某个数据时,一种办法是从字典的第一页开始往后翻,直到找我们需要的数据为止。这种方法就是在列表中查找要元素的办法,缺点是字典中的数据越多,其查找速度越低。第二种办法是现在字典的索引表里查找数据对应的位置,然后直接翻到这个位置查找数据,这种方法比第一种方法效率高,查找速度非常快。
特点:
- 字典中的所有元素都是key-value对,通过指定的key,总能找到确定的vlaue
- 字典中不能存在重复的key,但是可以存在重复的vlaue
- 字典中的元素是无序的,顺序不重要,重要的是key-value映射关系
- 字典中的key必须是不可变对象,因为要通过key的hash值来计算value的存储位置,必须确保每次计算的hash值是相同的,只有不可变对象才存在hash值
- 字典可以根据需要动态伸缩,使用前不需要声明字典的容量
- 字典会浪费较大的内存,是以空间换时间
字典的创建
1、使用{},不可变类型的数据都可以作为字典的key
>>> d = {'name':'Jerry', 'age':18}
>>> d
{'name': 'Jerry', 'age': 18}
>>> dict({1:2})
{1: 2}
>>> dict({(1,):2})
{(1,): 2}
>>> dict({frozenset([1]):1})
{frozenset({1}): 1}
2、使用内置函数dict()
方法1
>>> d = dict(name = 'Jerry', age = 18)
>>> d
{'name': 'Jerry', 'age': 18}
方法2
>>> d = dict([('name', 'Jerry'), ('age', 18)])
>>> d
{'name': 'Jerry', 'age': 18}
方法3
>>> d = dict({'name':'Jerry', 'age':18})
>>> d
{'name': 'Jerry', 'age': 18}
方法4
>>> d = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d
{'one': 1, 'two': 2, 'three': 3}
3、dict.fromkeys()方法通过参数指定所有的key,所有value默认都是None
>>> dict.fromkeys(['name', 'age'])
{'name': None, 'age': None}
>>> dict.fromkeys(('name', 'age'))
{'name': None, 'age': None}
>>> dict.fromkeys(('name', 'age'), 'N/A')
{'name': 'N/A', 'age': 'N/A'}
字典的查操作
1、使用中括号,如果字典中不存在指定的key,抛出KeyError
>>> d = {'name':'Jerry', 'age':18}
>>> d['name']
'Jerry'
>>> d['ad']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'ad'
2、调用get方法,如果字典中不存在指定的key,不会抛出KeyError,而是返回None
>>> d = {'name':'Jerry', 'age':18}
>>> d.get('name')
'Jerry'
>>> print(d.get('ad'))
None
可以通过参数设置默认的value,以便在字典中不存在指定的key时,将其返回
>>> print(d.get('ad', 'Beijing'))
Beijing
3、通过运算符in (not in)检查字典中是否存在(不存在)指定的key
>>> d
{'name': 'Jerry', 'age': 18}
>>> print('name' in d)
True
>>> print('ad' in d)
False
>>>
>>> print('ad' not in d)
True
字典的改操作
1、为已经存在的key赋予一个新的值,一次只能修改一个key对应的value
>>> d
{'name': 'Jerry', 'age': 18}
>>>
>>> d['age'] = 20
>>> d
{'name': 'Jerry', 'age': 20}
2、调用方法update(),一次至少修改一个key对应的value
>>> d = {'name': 'Jerry', 'age': 18, 'add': 'Beijing'}
‘’传入一个字典
>>> d.update({'name':'Jack', 'age':20})
>>> d
{'name': 'Jack', 'age': 20, 'add': 'Beijing'}
传入一个元组的列表
>>> d
{'name': 'Jack', 'age': 20, 'add': 'Beijing'}
>>>
>>> d.update([('name', 'Mike'), ('age', 25)])
>>>
>>> d
{'name': 'Mike', 'age': 25, 'add': 'Beijing'}
将key当做变量
>>> d
{'name': 'Mike', 'age': 25, 'add': 'Beijing'}
>>>
>>> d.update(name = 'Tom', age = 17)
>>> d
{'name': 'Tom', 'age': 17, 'add': 'Beijing'}
字典的增操作
如果想要向字典中添加key-value对,有两种方法:
1、为不存在的key赋予一个value值,一次只能添加一个key-value对
>>> d = {'name': 'Jerry', 'age': 20}
>>> d['add'] = 'Beijing'
>>> d
{'name': 'Jerry', 'age': 20, 'add': 'Beijing'}
2、调用update()方法,同样的,有上述修改中的几种方式,传入的key的值不能重复,否则就是更新,而不是新增了
传入一个字典
>>> d = {'name': 'Jerry', 'age': 20}
>>> d.update({'add':'Beijing', 'gender':'male'})
>>> d
{'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
传入一个元组的列表
>>> d = {'name': 'Jerry', 'age': 20}
>>>
>>> d.update([('add','Beijing'), ('gender','male')])
>>> d
{'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
将key当做变量
>>> d = {'name': 'Jerry', 'age': 20}
>>> d.update(add = 'Beijing', gender = 'male')
>>> d
{'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
字典的删操作
1、调用方法pop(),会返回删除key的value值,字典的pop()方法需要传一个参数,传的是字典中的任一的key值
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>>
>>> d.pop('age')
20
>>> d
{'name': 'Jerry', 'add': 'Beijing', 'gender': 'male'}
如果pop的key不存在,则抛出KeyError
>>> d.pop('score')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'score'
为了防止指定的key不存在时抛出KeyError,可以通过参数指定一个默认返回的value
>>> d.pop('score', 90)
90
2、使用del语句,一次只能删除一个key-value对
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>> del d['age']
>>> d
{'name': 'Jerry', 'add': 'Beijing', 'gender': 'male'}
3、调用方法popitem(),会返回删除的key的value值,该方法不能传递参数,一次只删除一个任意的key-value对
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>> d.popitem()
('gender', 'male')
>>> d
{'name': 'Jerry', 'age': 20, 'add': 'Beijing'}
>>> d.popitem()
('add', 'Beijing')
>>> d
{'name': 'Jerry', 'age': 20}
>>>
>>> d.popitem()
('age', 20)
>>> d
{'name': 'Jerry'}
>>>
>>> d.popitem()
('name', 'Jerry')
>>> d
{}
4、调用方法clear(),清空字典
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>> d.clear()
>>> d
{}
为字典中指定的key设置默认的value值
为了确保字典中指定的key总是存在的,可以调用方法setdefault,这样,
1、如果字典中存在指定的key,该方法返回指定的key对应的value,字典不发生变化。
>>> d = {'name': 'Jerry'}
>>> d.setdefault('name', 'newname')
'Jerry'
2、如果字典中不存在指定的key,该方法返回指定的默认value值,并会在字典中添加一个对应key-value对
>>> d.setdefault('newname', 'newname')
'newname'
>>> d
{'name': 'Jerry', 'newname': 'newname'}
字典的视图
得到字典相关视图的三个方法:
1、keys()方法:返回字典所有key的视图
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>>
>>> d.keys()
dict_keys(['name', 'age', 'add', 'gender'])
2、values()方法:返回字典所有value的视图
>>> d.values()
dict_values(['Jerry', 20, 'Beijing', 'male'])
3、items()方法:返回字典所有key-value对的视图
>>> d.items()
dict_items([('name', 'Jerry'), ('age', 20), ('add', 'Beijing'), ('gender', 'male')])
视图会随字典的变化而变化
以keys举例,其他两个同理
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>> k = d.keys()
>>> k
dict_keys(['name', 'age', 'add', 'gender'])
>>>
>>> d.pop('gender')
'male'
>>>
>>> d
{'name': 'Jerry', 'age': 20, 'add': 'Beijing'}
>>>
>>> k
dict_keys(['name', 'age', 'add'])
借助字典创建格式化字符串
当格式化字符串中的占位符是%,并且占位符对应的实际值来自于某个字典的value时,可以把所有的实际值改写为字典,同时根据字典的value对应的key,在占位符%后添加”(key)”,其中,字典的key会被添加一堆引号,因此,如果字典的key是字符串,需要去掉字典的key自带的引号。
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>> print('姓名:%s,年龄:%d,住址:%s,性别:%s' %(d['name'], d['age'], d['add'], d['gender']))
姓名:Jerry,年龄:20,住址:Beijing,性别:male
可以改写为
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>> print('姓名:%(name)s,年龄:%(age)d,住址:%(add)s,性别:%(gender)s' %(d))
姓名:Jerry,年龄:20,住址:Beijing,性别:male
{}作为占位符
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>> print('姓名:{},年龄:{},住址:{},性别:{}'.format(d['name'], d['age'], d['add'], d['gender']))
姓名:Jerry,年龄:20,住址:Beijing,性别:male
可以改写为
>>> d = {'name': 'Jerry', 'age': 20, 'add': 'Beijing', 'gender': 'male'}
>>> print('姓名:{name},年龄:{age},住址:{add},性别:{gender}'.format_map(d))
姓名:Jerry,年龄:20,住址:Beijing,性别:male
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com