• 【笔记】:如何在字典遍历中删除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'}
    

      

  • 相关阅读:
    vue2.0 微信分享
    小程序开发:canvas在画布上滑动,页面跟着滑动问题
    前端AES解密
    vue2上传图片到OSS
    vue给不同环境配置不同打包命令
    vue页面绑定数据,渲染页面时会出现页面闪烁
    解决微信浏览器无法使用window.location.reload刷新页面
    vue列表拖拽组件 vue-dragging
    千万别在Java类的static块里写会抛异常的代码!
    linux shell的一些配置
  • 原文地址:https://www.cnblogs.com/lianzhilei/p/7492953.html
Copyright © 2020-2023  润新知