前言
练习第一篇已经结束,作者也是温故而知新。再接再厉,第二篇练习开始:
练习
数据类型转换1
现在有以下数据, li1 = ["{‘a’:11,‘b’:2}","[11,22,33,44]"]
需要转换为以下格式: li2 = [{‘a’:11,‘b’:2},[11,22,33,44]]
分析
这个十分简单,照顾一下小白,先来一场分析:转换前后的数据类型仍是list,只是里面元素的数据类型发生了改变,由字符串转成它原来的数据类型
- 常用技能可迭代数据类型遍历及eval()函数
# 测试数据
li1 = ["{'a':11,'b':2}","[11,22,33,44]"]
li2=[]
for data in li1:
li2.append(eval(data))
print(li2) # 输出:[{'a':11,'b':2},[11,22,33,44]]
数据类型转换2
有一组用例数据如下:
cases = [
['case_id', 'case_title', 'url', 'data', 'excepted'],
[1, '用例1', 'www.baudi.com', '001', 'ok'],
[4, '用例4', 'www.baudi.com', '002', 'ok'],
[2, '用例2', 'www.baudi.com', '002', 'ok'],
[3, '用例3', 'www.baudi.com', '002', 'ok'],
[5, '用例5', 'www.baudi.com', '002', 'ok'],
]
- 这个相较前面的基础而言有点复杂,也算是提前剧透:可以看到cases列表数据的第1个元素,它是表头,与之对应的就是title的数据,这是为后面的接口测试用例设计的数据格式做铺垫。
要求一:把上述数据转换为以下格式
res= [
{'case_id': 1, 'case_title': '用例1', 'url': 'www.baudi.com', 'data': '001', 'excepted': 'ok'},
{'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 2, 'case_title': '用例2', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 3, 'case_title': '用例3', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
- 遍历少不了,结果除去表头的数据与表头形成一个个字典数据类型,这样方便取值,读到同一行同一列的数据都用同样的key。
lis_d = []
for i in range(1, len(cases)):
dic = {
}
for j in range(len(cases[0])):
dic[cases[0][j]] = cases[i][j]
lis_d.append(dic)
- 换一个解法:
res1 = []
for value in cases[1:]:
# 将遍历的value和key进行聚合打包,并转换为字典
temp_res = dict(zip(cases[0], value))
res1.append(temp_res)
- 总结:两个解法得到的结果一样,但是从效率上看第二个解法应该高一些,就从使用了python的内置函数和少了一层for循环,姑且这样推断吧,从代码结构上看,第二个解法的代码结构也比较清晰:dict将zip打包的两个列表数据,转成字典数据类型。
要求二:把上面转换好的数据中case_id大于3的用例数据获取出来,得到如下结果
res= [
{
'case_id': 1, 'case_title': '用例1', 'url': 'www.baudi.com', 'data': '001', 'excepted': 'ok'},
{
'case_id': 4, 'case_title': '用例4', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{
'case_id': 2, 'case_title': '用例2', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{
'case_id': 3, 'case_title': '用例3', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'},
{
'case_id': 5, 'case_title': '用例5', 'url': 'www.baudi.com', 'data': '002', 'excepted': 'ok'}
]
- 解法一:遍历所有元素,条件判断id大于3的数据组成新的列表
res1 = []
for i in lis_d:
if i['case_id'] > 3:
res1.append(i)
print(res1)
- 方法二: 使用匿名函数及filter函数
res2 = list(filter(lambda x: x['case_id'] > 3, res1))
-
- filter()返回的是一个迭代器,可以被list、tuple接收
扩展
前面的数据类型连接还算简单,但是用到的知识可能有点刁钻,如果不是勤加练习,可能都想不到还有第二种解法,甚至第三、第四种。为了增加难度,结合文件的读取,来对读取文件数据进行数据类型转换。
当前有一个case.txt文件,里面中存储了很多用例数据:
- 如下,每一行数据就是一条用例数据,
# 文件中数据
url:www.baidu.com,mobilephone:13760246701,pwd:123451
url:www.baidu.com,mobilephone:15678934551,pwd:234552
url:www.baidu.com,mobilephone:15678934551,pwd:234553
url:www.baidu.com,mobilephone:15678934551,pwd:234554
url:www.baidu.com,mobilephone:15678934551,pwd:234555
要求一: 请把这些数据读取出来,到并且存到list中,格式如下
[
{'url': 'www.baidu.com', 'mobilephone': '13760246701', 'pwd': '123451'},
{'url': 'www.baidu.com', 'mobilephone': '15678934551', 'pwd': '234552'},
{'url': 'www.baidu.com', 'mobilephone': '15678934551', 'pwd': '234553'},
{'url': 'www.baidu.com', 'mobilephone': '15678934551', 'pwd': '234554'},
{'url': 'www.baidu.com', 'mobilephone': '15678934551', 'pwd': '234555'}
]
- 代码实现
with open('cases.txt', 'r') as pf:
text = pf.read()
lines = text.split('\n')
li2 = []
for line in lines:
dic = {
}
for li in line.split(','):
li1 = li.split(':')
dic[li1[0]] = li1[1]
li2.append(dic)
要求二:将上述数据再次进行转换,转换为下面这种字典格式格式
li2={'data1':{'url': 'www.baidu.com', 'mobilephone': '13760246701', 'pwd': '123456'},
'data2':{'url': 'www.baidu.com', 'mobilephone': '15678934551', 'pwd': '234555'},
'data3':{'url': 'www.baidu.com', 'mobilephone': '15678934551', 'pwd': '234555'},
'data4':{'url': 'www.baidu.com', 'mobilephone': '15678934551', 'pwd': '234555'},
'data5':{'url': 'www.baidu.com', 'mobilephone': '15678934551', 'pwd': '234555'}
}
- 代码实现
dic1 = {
}
for i in range(len(li2)):
dic1['data{}'.format(i + 1)] = li2[i]