數據遍歷時不能犯傻系列
前言:
針對字典做一些操作時,有時會遇到下面的狀況,列如我們需要把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'}