最近在搞介面測試的時候發現了乙個比較有趣的json入引數,結構如下:
json = , , , }}]}]}]}], "gg": "33"}
觀察該json資料,我們發現有大量的相同的key(gg),並且這些key的value值都是一樣的,那麼我們需要修改所有key(gg)的值,應該怎麼做呢?
提問:為什麼會有這麼有趣的入引數據?
我也不知道,因為公司的出庫單的業務資料就有這麼可怕和奇葩的資料,只是沒有本文中舉例的那麼誇張
第一:我們可以把這個資料封裝成乙個函式,實現如下所示:
def這樣很完美的解決我們的問題了。完美,解題結束......enenen、但是這會引生出另乙個問題,就是每次介面改動需要去修改**,不便於工具化(雖然在介面自動化後介面不太可能會發生改動),data(gg):
dict_data = , , , }}]}]}]}], 'gg'
: gg}
return
dict_data
print(data('
hahaha
'))
對於測試來說不可能人人都去搞工具化,但是你不能沒有乙個工具化的心。
ok,目標明確了,那麼我們需要搞個好的思路了,但是在這之前我們不得不先了解一下python對於字典的操作:
首先,最簡單的方法是直接建立字典,dict=
再次,先建立乙個空字典,然後對字典進行賦值或者修改,具體如下圖所示:
從上圖中可以看出,我們是可以直接對字典進行操作的結構為dict["key"] = value,dict["key"] 表示字典的key,value表示key的值,簡單點說就是字典裡面的元素,
以及元素的值是什麼,但是有一點要清楚,字典裡面key的值它可以是乙個字串,可以是數字,可以是列表,可以是字典。(說明:在python中json串可以理解是乙個字典)。
不難理解,我們在上圖中直接對乙個空字典定義了元素和元素值,那麼對巢狀字典改如何進行操作呢?這裡以比較有趣的json入引數來進行講解:
如上圖所示,每乙個需要修改的key都需要指明路徑,所以非常麻煩,非常難搞,隨著明細的增加,說不定形同名稱的key還會更多,然後有需要手動指明,
這種方法還不如用函式去修改key的值,所以還需要再想想辦法。
dict_data = , , , }}]}]}]}], '如上圖**所示:總的來說就是將字典迴圈判斷曲直並修改,然後就完事了咯。gg': 'gg'
}key = 'gg'
defupdate(key,dict_data):
#判斷需要修改的key是否在初始字典中,在則修改
if key in
dict_data:
#將key為'gg'的值修改成'張三'
dict_data[key]='張三'
#print(dict_data)
#迴圈字典獲取到所有的key值和value值
for keys,values in
dict_data.items():
#判斷valus值是否為列表或者元祖
ifisinstance(values,(list,tuple)):
#迴圈獲取列表中的值
for i in
values:
#判斷需要修改的值是否在上乙個迴圈出的結果中,在則修改
if key in i and
isinstance(i,dict):
#呼叫自身修改函式,將key的值修改成'張三'
update(key,i)
else
:
#否者則呼叫獲取value函式
get_value(i)
elif
isinstance(values,dict):
if key in
values:
update(key,values)
else
:
for keys,values in
values.items():
ifisinstance(values,dict):
update(key, values)
else
:
#迴圈獲取原始字典的values值
for keys,values in
dict_data.items():
#判斷values值是否是列表或者元祖
ifisinstance(values,(list,tuple)):
#如果是列表或者元祖則迴圈獲取裡面的元素值
for i in
values:
#判斷需要修改的key是否在元素中
if key in
i:
#呼叫修改函式修改key的值
update(key,i)
else
:
#否則呼叫獲取values的值函式
get_value(i)
#判斷values值是否為字典
elif
isinstance(values,dict):
#判斷需要修改的key是否在values中
if key in
values:
#呼叫修改函式修改key的值
update(key,values)
else
:
#獲取values值的函式
get_value(values)
return
dict_data
defget_value(tt):
#迴圈獲取values的值
for values in
tt.values():
#判斷迴圈出的value的值是否為列表或者元祖
ifisinstance(values, (list,tuple)):
#如果為列表或者元祖則迴圈獲取列表或者元祖中的值
for i in
values:
#判斷需要修改的值是否在迴圈出的值中,且i為字典
if key in i and
isinstance(i,dict):
#呼叫修改函式,將key的值修改為'張三'
update(key, i)
else
:
#否則呼叫獲取value函式
get_value(i)
elif
isinstance(values,dict):
if key in
values:
update(key, values)
else
: get_value(values)
update(key,dict_data)
這樣做的好處是,我們在做介面自動化的時候可以將資料與指令碼分離,只需在excel中維護好入參,指定獲取返回變數值即可
Python字典巢狀
1 import copy 2 menu 10 程式設計 11,17 伺服器程式設計 18,23 24 網頁設計 31 後端 32353637 38 3940 41 menu copy copy.deepcopy menu 424344 print menu copy.pop 電腦科學與技術 字典巢...
Python字典的巢狀操作
在機器學習中會用字典的巢狀來儲存決策樹的資訊,對繪製樹形圖有很大的作用,其中巢狀字典的生成是乙個遞迴的過程 如下所示 s b 構造字典 s a 0 取值 no s a 1 s a 1 flippers 1 maybe 巢狀構造過程 s s no sur 0 no s ss ss fli 0 no s...
python 有序字典與巢狀字典
1.ordereddict 有序字典 ordereddict是dict的子類,它記住了內容新增的順序。而普通字典是無序的。普通字典 import collections d dict d a a d b b d c c for k,v in d.items print k,v a ac c b b有...