首页 > 代码库 > python内置的一个好玩的函数-zip,并且巧妙的实现按概率随机生成有限个数的字符串。

python内置的一个好玩的函数-zip,并且巧妙的实现按概率随机生成有限个数的字符串。

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

def random_pick(seq,probabilities):
    x = random.uniform(0, 1)#首先随机生成一个0,1之间的随机数
    cumulative_probability = 0.0
    for item, item_probability in zip(seq, probabilities):#seq代表待输入的字符串,prob代表各自字符串对应的概率
        cumulative_probability += item_probability#只有当累加的概率比刚才随机生成的随机数大时候,才跳出,并输出此时对应的字符串
        if x < cumulative_probability:
            break
        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])

输出结果为:

技术分享 

 

python内置的一个好玩的函数-zip,并且巧妙的实现按概率随机生成有限个数的字符串。