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'}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM