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])

輸出結果為:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM