python中字典增删改查,以及使用字典为json去重

一、字典简介

字典,也就是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对我们代码的性能大有裨益。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值