【笔记】:如何在字典遍历中删除key值总结

虾米哥 阅读:177 2021-05-02 13:39:51 评论:0

数据遍历时不能犯傻系列

前言:

 针对字典做一些操作时,有时会遇到下面的状况,列如我们需要把data中的key值根据replace中的映射关系进行替换(Caller替换为caller)

data = { 'Caller': '01053180888', 'CompId': '800999','Callee': '13911517997','RingTime': '1', } 
replace ={ 'Caller': 'caller', 'CompId': 'compid','Callee': 'callee','RingTime': 'ring_time'} 

当然我知道字典在遍历的时候,不能进行删除操作(梯子原理),不然会报错;But,当我做测试的时候竟然没有报错

data = {'name':'18'} 
 
for name in data: 
    value = data[name] 
    del data[name] 
    data['age'] = value 
print(data) 
 
# {'age': '18'} 

握艹完全没有报错,那就按照这种方式去实现刚刚的需求吧,哈哈哈,然后有了下面的代码

data = { 'Caller': '01053180888', 'CompId': '800999','Callee': '13911517997','RingTime': '1', } 
replace ={ 'Caller': 'caller', 'CompId': 'compid','Callee': 'callee','RingTime': 'ring_time'} 
 
for key in data: 
    value = data[key] 
    if key in replace: 
        del data[key] 
        data[replace[key]] = value 
print(data) 
 
# {'Callee': '13911517997', 'RingTime': '1', 'caller': '01053180888', 'compid': '800999'} 

有一半内容竟然没有被替换掉,呵呵呵,打脸了,虽然没报错,但是并没有实现想要的效果。分析原理:没报错的原因是,在循环中删除key然后再添加一个key,梯子长度不变,不报错,但是由于key值有变化,所有接下来循环的key可能是新增的key值

既然在遍历字典的时候不能进行key值的删除,那么我们直接循环keys,然后对data进行增删,岂不是不影响,机智机智(鼓掌),然后有了下面代码

data = { 'Caller': '01053180888', 'CompId': '800999','Callee': '13911517997','RingTime': '1', } 
replace ={ 'Caller': 'caller', 'CompId': 'compid','Callee': 'callee','RingTime': 'ring_time'} 
     
keys = data.keys() 
     
for key in keys: 
    print(key) 
    value = data[key] 
    if key in replace: 
        del data[key] 
        data[replace[key]] = value 
print(data) 
 
{'Callee': '13911517997', 'RingTime': '1', 'caller': '01053180888', 'compid': '800999'} 

握艹啪啪又打脸了,这很不科学呀,为啥 为啥!明明循环的是keys跟data没毛线关系呀,打印了一下keys的类型,发现跟想象中的不一样呀

keys = data.keys() 
print(type(keys)) 
# <class 'dict_keys'>

keys根本不是一个列表,dict_keys会根据data的数据进行改变的

第一种方式:

用list函数,传入字典,会生成一个根据字典key值生成的列表,完美解决(鼓掌)

data = { 'Caller': '01053180888', 'CompId': '800999','Callee': '13911517997','RingTime': '1', } 
replace ={ 'Caller': 'caller', 'CompId': 'compid','Callee': 'callee','RingTime': 'ring_time'} 
 
 
for key in list(data): 
    value = data[key] 
    if key in replace: 
        del data[key] 
        data[replace[key]] = value 
print(data) 
 
{'caller': '01053180888', 'compid': '800999', 'callee': '13911517997', 'ring_time': '1'} 

第二种方式:

心中默念了三遍,我似不似傻..... 为啥一定要循环data呢?!  看看下面,这种代码又简单又骚气,竟然没想到,怀疑自己是不是不适合做开发, 凸(艹皿艹 )....

data = { 'Caller': '01053180888', 'CompId': '800999','Callee': '13911517997','RingTime': '1', } 
replace ={ 'Caller': 'caller', 'CompId': 'compid','Callee': 'callee','RingTime': 'ring_time'} 
 
 
for key in replace: 
    value = data.pop(key) 
    data[replace[key]] = value 
print(data) 
 
{'caller': '01053180888', 'compid': '800999', 'callee': '13911517997', 'ring_time': '1'} 

  


标签:javaPython
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
KIKK导航

KIKK导航

关注我们