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的值,集合 ...
随机推荐
- R语言绘图布局
在R语言中,par 函数可以设置图形边距,其中oma 参数设置outer margin, mar 参数设置margin, 这些边距有什么不同呢,通过box函数可以直观的看到 box 默认在当前图形绘制 ...
- 一个窗口里包含一个iframe,点击iframe内的submit按钮,返回的视图总是显示在iframe中,我想要的效果是点击按钮后返回的视图是在浏览器窗口中...?asp.net mvc 的action中,不用js怎么实现??????????
Content("<script type='text/javascript'>parent.location.href = '" + url + "';&l ...
- Windows下基于eclipse的Storm应用开发与调试
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3971113.html 本文以一个简单的example来讲解如何开发storm应用程序 1.创建maven ...
- POJ 1243 One Person
题意: 猜数字, 给定 G, L, G 表示可以猜的次数, 每猜一次, G减一, 假如猜的 number 大于 target, L 还需减一, 当 L == -1 或者 G==0 时, 若还没猜中, ...
- swift - UIPickerView 的使用
效果显示数下图: 1.初始化 pickerView.center = self.view.center //将dataSource设置成自己 pickerView.dataSource=self // ...
- 第一篇:《UNIX 网络编程 第二版》编译环境的搭建
第一步:搭建基本的编译环境 安装gcc, g++, bulid-essential等编译软件 第二步:下载本书示例源码包 第三步:解压下载到的包并放在用户主目录中 第四步:进入包内并执行以下命令 su ...
- UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView
« 对Cocos2d游戏引擎有一定的了解和实践,并接触过处理3D图形和模型库的OpenGL 在进行游戏界面的绘制工作中,需要处理大量的工作,这些工作有很多共性的操作:并且对于游戏界面的切换,元素动作的 ...
- 多字节(一般指GBK) utf8 Unicode 编码互转
// c:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinNls.h #define CP_ACP 0 // default to ANS ...
- vertical-align负值和margin-bottom负值的区别
先看一下vertical-align在W3C当中的值有哪一些: 可是它有数值这一说确实很少提起,我们来看这么一段代码: <!DOCTYPE html> <html lang=&quo ...
- Android 使用RadioGroup和RadioButton实现单选效果
RadioButton和CheckBox的区别:CheckBox选中之后可以直接取消,RadioButton选中之后不能直接取消,所以一般情况下不建议单独使用.1.RadioGroup:RadioBu ...