Python开发【笔记】:如何在字典遍历中删除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'}
Python开发【笔记】:如何在字典遍历中删除key值?的更多相关文章
- python开发笔记-str转字典
后台接收到post请求数据格式为json格式的字符串,不能直接用字典的get方法 909090909090909090909090909090909 Internal Server Error: /g ...
- python开发笔记-变长字典Series的使用
Series的基本特征: 1.类似一维数组的对象 2.由数据和索引组成 import pandas as pd >>> aSer=pd.Series([1,2.0,'a']) > ...
- 【python学习笔记】4.字典:当索引不好用时
[python学习笔记]4.字典:当索引不好用时 字典是python中唯一内建的map类型 创建: key可以为任何不可改变的类型,包括内置类型,或者元组,字符串 通过大括号: phonebook={ ...
- python开发笔记-通过xml快捷获取数据
今天在做下python开发笔记之如何通过xml快捷获取数据,下面以调取nltk语料库为例: import nltk nltk.download() showing info https://raw.g ...
- /编写一个函数,要求从给定的向量A中删除元素值在x到y之间的所有元素(向量要求各个元素之间不能有间断), 函数原型为int del(int A ,int n , int x , int y),其中n为输入向量的维数,返回值为删除元素后的维数
/** * @author:(LiberHome) * @date:Created in 2019/2/28 19:39 * @description: * @version:$ */ /* 编写一个 ...
- Python 学习笔记6 变量-字典
字典是python中一个十分重要的变量,他是一个可变的容器对象.通过一组key(键)和value(值)对组成一个元素. 组成形式为{'key':'value', 'key':'value'}.整个字典 ...
- python学习笔记(三)-列表&字典
列表: 一.列表操作"""Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素.比如,列出班里所有同学的名字,就可以用一 ...
- python学习笔记6(字典)
映射:键值对的关系,键(key)映射值(value) 字典是Python唯一的映射类型 >>> phonebook = {'} >>> phonebook {'} ...
- python学习笔记(三)、字典
字典是一种映射类型的数据类型.辣么什么是映射呢?如果看过<数据结构与算法>这一本书的小伙伴应该有印象(我也只是大学学习过,嘻嘻). 映射:就是将两个集合一 一对应起来,通过集合a的值,集合 ...
随机推荐
- VNC轻松连接远程Linux桌面(1)
Linux平台安装VNCServer Windows平台使用VNC-Viewer 方法/步骤 在Linux平台安装VNCServer服务端软件包. #yum -y install vnc *v ...
- Unity3D - 详解Quaternion类(二)
OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler ...
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
问题一:多线程有几种实现方法?同步有几种实现方法? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与not ...
- otunnel : 一个和lcx差不多的端口转发的工具
项目地址 ooclab/otunnel 下载地址(内涵各大平台) http://dl.ooclab.com/otunnel/ otunnel 用法 前提: 1. 假设 server 的地址为 exam ...
- php 错误和异常处理
一.错误和异常处理 1.1 错误类型和基本的调试方法 PHP程序的错误发生一般归属于下列三个领域: 语法错误: 语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行 ...
- c++ ifstream
1.判断文件是否打开if(a.fail())if(!a.good())if(!a)上面3个等价 但上面的无法检测到 : 以不合适的文件模式打开文件失败a.is_open()可以检测到这个错误 所以推荐 ...
- write solid code 零散(原文)
整理下目录,看了这个文件,幸好未删除. 以下是<write solid code>中的原文摘录. 1.How could I have prevented this bug? 2.How ...
- LINUX 环境变量总结
1.概述 Linux是一个多用户的操作系统.多用户意味着每个用户登录系统后,都有自己专用的运行环境.而这个环境是由一组变量所定义,这组变量被称为环境变量.用户可以对自己的环境变量进行修改以达到对环境的 ...
- TFS 强制删除锁定文件(数据库)
TFS:TFS2010 VS:VS2012 OS:Windows2008 DB:Sqlserver2008 R2 我们在团队开发当中,版本控制是一个不可忽略的工具.我们团队使用的是TFS2010这个版 ...
- android学习之--网格视图(GridView)和图像切换器(ImageSwitcher)
GridView用于在界面上按行.列分布显示多个组件.GridView和ListView有共同父类:AbsListView. GridView与ListView的差别在于:ListV ...