用itertools.product簡化嵌套for循環
阿新 • • 發佈:2017-05-18
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循環