这是一个汉字字符串: "银行卡测试"

我要求出他的拼音首字母组合,

预期:"yhkcs"

实际:"yhqcs"

没错,它含有一个多音字:卡

念ka 或者 qia

我的需求就变成了:我要获取它所有可能的首字母组合,放到一个大列表中。

通过第三方pinyin库,我成功的拿到了他们首字母组成的二维数组,每个元素就是一个字的首字母列表:

"银行卡测试" = [['y'],['h'],['q','k'],['c'],['s']]

这个的最终结果应该是:

['yhqcs','yhkcs']  长度为2

当然,换一个多个多音字的:

"长卡测" = [['c','z'],['q','k'],['c']]

预期结果:

['cqc','ckc','zqc','zkc']  长度为4

最终元素总个数为每个子列表长度的乘积。

当然还有更复杂的:

[['a','b','c','d'],['e','f','g'],['h','i']]

这个预期大列表的长度应该是 4*3*2 = 24

那么以上的需求用代码如何实现?

苦思冥想,写出了一套算法,我觉得我应该是唯一一个这么写的:

from allpairspy import AllPairsold = [['a','b','c','d'],['e','f','g'],['h','i']]ready = []for pairs in AllPairs(old[:2]):    ready.append(''.join(pairs))for i in range(2, len(old)):  new_r= []  for pairs in AllPairs([ready, old[i]]):    new_r.append(''.join(pairs))    ready=new_r
print(ready)print(len(ready))

给大家看看结果:

一点问题没有。

至于为什么我会想出这个解决办法呢?

我给大家说一下思路,非常有意思

首先我觉得直接去写递归 很麻烦。效率也不行,就想着有没有野路子搞定。

然后突然想到,这一个一个的子列表,就好像是我们测试中面对一个功能界面

上的一个一个多选输入框,而子列表内不确定数量的字母,就像是这些多选框内的子选项。

我们平时遇到要测试这种功能的时候,要怎么做呢?目的就是要尽可能的测出所有组合情况!

即每个下拉多选框只能选一个。多个框的各种组合我都要测到。

他们直接很明显没有任何逻辑强关联,这时我们应该首选 黑盒用例设计方法中的 正交!

是的正交,它可以自动生成各种情况对应的组合,每种组合就是一条最终用例!

但是!

正交算法的出现 就是为了避免穷尽测试,而我这次的需求就是要穷尽所有可能组合。

所以正交算法要稍微改一改了,毕竟这个第三方算法性能很好,我利用上性能绝对错不了!

正交的基本原则是 保证多个输入条件中,任何一个的子状态,和任何另外一个输入中的子状态 都同时出现过 即可。最终正交算法出来的所有组合数量,肯定是远小于全部组合的。

比如:

[['a','b'],['c','d'],['e','f']]

穷尽的数量应该是:2*2*2 = 8

而正交算法的数量:

['a', 'c', 'e']

['b', 'd', 'e']

['b', 'c', 'f']

['a', 'd', 'f']

最终4种,这4种你可以发现,任何俩个子列表的任何子元素都同时出现过。

比如:a 和f ,有。

d和e 也有。

所以正交算法是为了降低我们测试用例数量,但又保证全面覆盖的东西。

但是这里我们要如何应用它以便让其变成输出穷尽所有的 8种结果呢?

很简单,当只有俩个子列表,也就是只有俩个输入的时候。那么此时,正交算法的结果和穷尽结果 是完全相等的。

也就是说,我这个需求虽然可能有4个甚至更多个子列表,但是我只要用正交算法每次只算其中俩个子列表的穷尽,然后再把这个穷尽的结果当作一个新的子列表,再去和另一个新的子列表去计算穷尽,然后再把结果当作一个新的子列表再去和下一个子列表计算穷尽,直到没有子列表了,这时候的新的子列表就是最终结果!

大家是不是看到比较绕?

我用图来说明:

每次这样叠加算出后 最后就是最终结果。安全快捷准确!

然后就成了最上面的我分享的那个最终算法。

有兴趣的可以试试。当然我觉得 我应该是唯一一个靠 这么曲线救国的做法的测试了吧。

能想出这个方法,首先要感谢

  1. 我庞大精通的测试理论基础:黑盒测试用例设计方法-正交法

  2. 研究过正交的第三方python函数: allpairspy

  3. 长年刷leetcode练就的骚操作思维

所以小伙伴们,千万不要再说刷leetcode,写算法对我们测试没有用了。

别忘了点赞和分享

感兴趣的可以加群,加博主微信:qingwanjianhua 拉你入群

加社团:https://testerhome.com/wqrf

关注博主博客:https://wangzijia.blog.csdn.net/

点亮该项目:https://github.com/Woqurefan/ApiTest/

体验在线地址:http://47.97.77.125:8000/home/

公众号:测试开发干货

python二维列表每个子列表取一个元素的所有组合相关推荐

  1. 案例演示Python二维列表与Java二维数组

    1.Python二维列表案例演示 运行程序,结果如下: 2.案例演示Java二维数组 package net.hw.test;/*** 功能:二维数组用法示例* 作者:华卫* 日期:2013年12月1 ...

  2. python 二维列表_python二维列表

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 方法一:使用 lambda 关键词辅助对二维列表进行排序,lambda的使用方法 ...

  3. Python 二维列表按多列排序 反向排序

    Python 二维列表按多列排序 (有多个元素需要排序 代码 代码 两种方法均可 raw_list = [[6,2,'c'],[4,5,'b'],[7,8,'a']]sorted_list = sor ...

  4. Python二维列表转换为一维列表

    Python二维列表转换为一维列表 Python二维数组转换为一维数组 二维转一维 # 第一种写法 拆解的写法a = [] ab = [[1,2,3], [5,8], [7,8,9]] for ite ...

  5. Python二维列表赋值问题

    Python二维列表的赋值问题 使用该方法建立的二维列表,对a[0][0]进行赋值1,结果第一列全部被赋值为1: >>> a = [[0]*5]*5 >>> a [ ...

  6. Python 二维列表操作

    Python 二维列表操作 创建二维列表对象 初始化一个2*3尺寸大小的全零二维列表 获取二维列表行元素的个数 获取二维列表总元素个数 今天介绍一下 Python中二维列表的一些操作. 创建二维列表对 ...

  7. python二维列表

    python二维列表 1. 本质 2. 创建二维列表 3. "读" 二维列表 4. "写" 二维列表 5. 遍历二维列表 6. 练习1 7. 练习2 1. 本质 ...

  8. python二维列表转置

    python 二维列表转置 def transpose(self, matrix):new_matrix = []for i in range(len(matrix[0])):matrix1 = [] ...

  9. python二维列表转一维列表

    list_ = [[1,2,3], [5,8], [7,8,9]] 法一 [i2 for i1 in list_ for i2 in i1] 法二 sum(list_,[]) 法三 from tkin ...

最新文章

  1. 轻量级网络skipnet
  2. index 4 is out of bounds for dimension 1 with size 4
  3. php的filter input,记一个php://filter和php://input的CTF题
  4. Linux内核模块学习笔记(转载)
  5. 重磅|施耐德电气O2O数字化咨询服务强势来袭
  6. HTML-JS 循环 函数 递归
  7. react api_使用Java EE 8中的React式API加速服务
  8. linux创建逻辑目录,Linux创建逻辑卷
  9. 致我们终将逝去的39%“峰值性能”!
  10. Vue小案例 之 商品管理------添加商品
  11. 从 0 开始学习 GitHub 电子书免费送
  12. c语言量程程序,量程自动切换数字电压表c语言原程序
  13. C实现的UDP压力测试工具
  14. 21世纪将淘汰的八种人
  15. 苹果HomeKit生态深度解析,在智能家居领域后发制人?
  16. redis为什么快?
  17. Dep包管理的主要机制
  18. 大学生活该如何度过?思维导图告诉你
  19. 疫情之下,企业和员工到底该何去何从?
  20. 如何选择合适的境外网站服务器?

热门文章

  1. ACM大量习题题库及建议培养计划
  2. python xlrd使用_在Python中使用xlrd以文本形式读取数值Excel数据
  3. deepin做服务器稳定吗,deepin从兴致勃勃到彻底放弃
  4. phpmywind 数据记录查询
  5. c语言课程设计作业五子棋,c语言课程设计案例-五子棋.ppt
  6. Hoodoop-MapReduce学习
  7. Slowly Change Dimention 常见三种类型
  8. 前端vue中ts无法识别引入的vue文件,提示找不到xxx.vue模块的解决【引入新建页面或者通过router引入时报错】
  9. 姜烧猪肉+日式厚蛋烧+蚝油青笋
  10. php 验证手机号码格式