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

数据遍历时不能犯傻系列

前言:

 针对字典做一些操作时,有时会遇到下面的状况,列如我们需要把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'}

  

原文地址:https://www.cnblogs.com/lianzhilei/p/7492953.html