一、字典简介
字典,也就是hash表,以key:value存储,学过数据结构的知道,hash也是一种散列函表,而散列表是由散列函数来决定其存储,所以,当我们看到这些词汇不应该会陌生。
hash是一种查找效率非常高的一种表,查询的时间复杂度为o(1),可以想一下根据键可以直接拿到值,不需要任何的遍历。
hash除了在我们python中以字典的形式存在,在redis中也有hash表,两者操作原理相同,同类比学习会使我们理解更加深入。
二、字典常用操作
1、根据键获取值
dicts = {"name": "zhangsan", "age": 18}
#根据键以反括号获取
name = dicts["name"]
#get方式获取
age = dicts.get(age)
print name
print age
result:zhangsan
18
两中方式都可以获取想要的值,但是指的注意的是,若dicts[key]的方式获取时,若字典里没有该key则报错。而get方法不会,若没有key时,get方法返回None对象.
2、字典删除元素
方法一:clear()
dicts = {"name": "zhangsan", "age": 18}
dicts.clear()
print dicts
result:{}
该方法直接对字典操作,清空字典中所有元素,没有返回值。
方法二:pop(key)
dicts = {"name": "zhangsan", "age": 18}
ret = dicts.pop("name")
print ret
print dicts
result: "zhangsan"
{"age": 18}
该方法会删除字典中键对应的元素,并返回该元素value。
方法三:popitem()
dicts = {"name": "zhangsan", "age": 18}
ret = dicts.popitem()
print ret
print dicts
result: 18
{"name": "zhangsan"}
该方法表示随机删除一个元素,并返回删除的value,该方法非常适合便利逐一删除元素
方法四:del dicts[key]
dicts = {"name": "zhangsan", "age": 18}
del dicts["name"]
print dicts
result: {"name": "zhangsan"}
该方法同pop相似,可删除指定元素,但是没有返回值。
3、字典更新(合并)
方法一:update()
dict1 = {"name": "zhangsan", "age": 18}
dict2 = {"name": "lisi", "gender": "male"}
dict1.update(dict2)
print(dict1)
result: {'name': 'lisi', 'age': 18, 'gender': 'male'}
该方法相当于把dict2的内容加到了dict1中,但若dict2中有和dict1中重复的键,则以dicts2中为主
方法二:使用items()方法
dict1 = {"name": "zhangsan", "age": 18}
dict2 = {"name": "lisi", "gender": "male"}
new_dict = dict(dict1.items() + dict2.items())
print new_dict
result: {'name': 'lisi', 'age': 18, 'gender': 'male'}
该方法达到的效果与update()一样,但是新建了个字典。
方法三:使用字典生成式
dicts1 = {"name": "zhangsan", "age": 18}
dicts2 = {"name": "lisi", "gender": "man"}
print {k:v for d in [dicts1, dicts2] for k,v in d.items()}
result: {'gender': 'man', 'age': 18, 'name': 'lisi'}
该方法看起来非常炫酷,原理就是使用了字典生成式,经常使用这种代码会让别人觉得你水平很高。
以上字典更新方法是在python2.x及以上版本都适用的,若使用python3.x及以上版本会有更多的方法,这里不一一说明。个人认为字典更新应用场景基本一致掌握一种即可。
4、利用字典对json去重
python中有json模块,字典和json之间转换非常方便、迅速。之前本人做过数据清洗工作,经常利用字典来对json去重。
一般而言json的格式都是[{},{},…{}]这种形式,这种形式的json处理起来也很便利。
去重的算法很简单,如下:
1、将json转为列表,用lists表示
2、创建一个空字典,用dict2表示
3、便利lists,然后根据去重元素在dict2中是否存在来判断lists中的字典是否重复
4、如果该元素的值在dict2中不存在,将该元素的值以键加入dict2
lists = []
dicts1 = {"name": "zhangsan", "age": 18}
dicts2 = {"name": "lisi", "gender": "man"}
dicts3 = {"name": "zhangsan", "age": 18}
lists.append(dicts1)
lists.append(dicts2)
lists.append(dicts3)
new_dict = {}
new_list = []
for item in lists:
if item["name"] not in new_dict:
new_list.append(item)
new_dict[item["name"]] = item["name"]
print new_list
print new_dict
result:[{'age': 18, 'name': 'zhangsan'}, {'gender': 'man','name': 'lisi'}]
{'lisi': 'lisi', 'zhangsan': 'zhangsan'}
该方法是利用了字典中key唯一的特性。可以简单的对json去重。希望对你有所帮助
5、对列表嵌套字典排序
方法:sorted(list, key=lambda x: x[key])
该方法可实现对指定元素进行排序
lists = [
{
"name": "zhangsan",
"age": 80
},
{
"name": "lisi",
"age": 50
},
{
"name": "wangwu",
"age": 18
},
{
"name": "zhaoliu",
"age": 32
}
]
lists = sorted(lists, key=lambda x:x["age"])
print lists
result: [{'age': 18, 'name': 'wangwu'}, {'age': 32, 'name': 'zhaoliu'}, {'age': 50, 'name': 'lisi'}, {'age': 80, 'name': 'zhangsan'}]
若要排序为降序加入参数 reverse=True即可。
值得注意的是python内置的排序算法是归并排序,时间复杂度为o(logn*n),是一种比较稳定排序。
以上只是字典的一些简单用法,对于字典(hash)这种数据结构应用非常多,比如说可以用存hash缓存,还有hash索引等。正确使用hash对我们代码的性能大有裨益。