1. 程式人生 > >用itertools.product簡化嵌套for循環

用itertools.product簡化嵌套for循環

rom 輸入密碼 暴力破解 abc 暴力破解密碼 .html 一個 字符串 ins

今天這一題叫做“偷瞄到的密碼”:

警察跟蹤一名竊賊來到了一個倉庫門前。倉庫的密碼鎖盤如下:

1 2 3

4 5 6

7 8 9

0

竊賊輸入密碼後進了門。警察“覺得”自己看到了密碼比如1357,但是也有可能是相鄰的數字(相鄰僅包括正上下左右,不包括對角線),比如第一位不是1,而是相鄰的4和2(不包括5)。

可能的密碼是哪些組合呢?

這道題目可以抽象成:

1. 0-9各自都對應了一組相鄰數字

現給定一個數字串:

2. 對數字串中的每個數字,找到對應的相鄰數組

3. 計算從這些相鄰組中各挑一個形成的所有可能組合並輸出

實現要點:

1. 上述#3實際上是一個嵌套的多重for循環:

  for 數字串中的每個數字:

    for 該數字相鄰數組中的每個數字:

用itertools模塊的product方法可以將這個過程簡化為一步完成。根據Python手冊,product(A, B)的結果是((x,y) for x in A for y in B)。

2. 對於函數或者方法如product(A, B, C, D),如果ABCD在一個列表裏ls=[A, B, C, D],如何把ls傳給product?

用*,即product(*ls)。

3. product的輸出為元組。用join合並元組的所有元素,以字符串的形式輸出密碼組合。

借用某個最佳實現:

from itertools import product

ADJACENTS 
= (08, 124, 2135, 326, 4157, 52468, 6359, 748, 85790, 968) def get_pins(observed): return [‘‘.join(p) for p in product(*(ADJACENTS[int(d)] for d in observed))]

暴力破解密碼之後,竊賊就是甕中之鱉啦!

用itertools.product簡化嵌套for循環