python有一个比较有意思的内置函数-----zip,可以把传入的两组list进行一个组合变形,再输出子元素为tuple的list,不过变形的方式比较抽象。
举个例子:
A=[1,2,3,4,5,6]
B=['a','b','c','d']
v1=zip(A,B)
v1的结果为:
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
比较直观的理解就是,A和B是两道拉链上的扣子,生成的list的子tuple,每一组tuple就是一对扣好了的扣子,并且从每组list的头一个元素开始“拉拉链”,即A的拉链是从1~6,B的拉链是从a~d,从头拉到结束,很明显拉到d就断扣子了,因此结果就很明显:1-a,2-b,3-c,4-d。5,6错开。
如果这时候要给定一个矩阵,例如3x3,并以以下方式输出:
A1=[1,2,3];A2=[4,5,6];A3=[7,8,9]
A1,A2,A3分别代表矩阵的每一行,现在做以下变化:
A1=[1,2,3]
A2=[4,5,6]
A3=[7,8,9]
zip(A1,A2,A3)
输出结果为:
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
三道拉链也可以拉起来~
A=
-------zip--------B=
这里可以看出来,是对原矩阵做转置
这时候让B1,B2,B3分布倒序输出,即输出B1[::-1],B2[::-2],B3[::-3],显然,结果就成了A的顺时针旋转90°的结果
同样,如果传入的是一个嵌套的list,可以通过*的方式输出结果,例如:
zip(*[(1, 4, 7), (2, 5, 8), (3, 6, 9)])
zip(*[[1, 4, 7], [2, 5, 8], [3, 6, 9]])
输出结果均为:
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
这个看着很抽象的的函数还有一个非常神奇的妙用----按概率随机生成一组字符串
举个例子,比如说,取20个随机字符串,候选的字符串包括a,b,c3个,并且各自出现的概率要求为0.1,0.3,0.6
defrandom_pick(seq,probabilities):
x= random.uniform(0, 1)#首先随机生成一个0,1之间的随机数
cumulative_probability = 0.0
for item, item_probability inzip(seq, probabilities):#seq代表待输入的字符串,prob代表各自字符串对应的概率
cumulative_probability+=item_probability#只有当累加的概率比刚才随机生成的随机数大时候,才跳出,并输出此时对应的字符串if x
return item
例如:
第一次x=0.09,第一次累加概率为0.1,满足条件,跳出并输出p=0.1的字符
第二次x=0.2,第一次累加概率0.1,不满足再累加至0.4,跳出输出p=0.3的字符
第三次x=0.3,第一次累加概率0.1,不满足再累加至0.4,跳出输出p=0.3的字符
第四次x=0.4,第一次累加概率0.1,不满足再累加至0.4,依然不满足再累加至1,跳出输出p=0.6的字符
于是之后x=0.5,0.6.。。。0.9,均输出p=0.6的字符
显然这样的输出满足这样的概率关系,从而达到了按概率输出随机字符串的效果。
for i in range(10):print random_pick("abc",[0.1,0.3,0.6])
输出结果为: