2012-06-25 41 views
0

我希望這是星期一itis踢在這一刻,但我覺得應該很容易 - 或者至少是優雅 - 給我一個腦屁。用例如下:查找python中一個單詞的所有組合(上下和符號)

查找特定單詞的所有可能組合,其中字母可以是任意大小寫或用字母替換。例如:

字: '密碼' 組合: '密碼', 'P @ ssw0rd', 'P @ 55w0rD' ......

我不想寫7個循環,以發現這一點,即使這是一次性的腳本,我們永遠不會再使用。

回答

5
import itertools 

places = [ 
    "Pp", 
    "[email protected]", 
    "Ss5", 
    "Ss5", 
    "Ww", 
    "Oo0", 
    "Rr", 
    "Dd", 
] 

for letters in itertools.product(*places): 
    print "".join(letters) 

如果您需要處理任意話,那麼你就需要編寫代碼來創建從字符串places列表。

+0

我試過'itertools.product',但沒有意識到它可能需要幾次迭代。我知道這很簡單,謝謝。 –

2

我會使用itertools.product

import itertools 
symbols = dict(a="@", s="5", o="0") # char -> str 
text = "password" 
print list(itertools.product(*[[letter, letter.upper()] + list(symbols.get(letter, "")) for letter in text.lower()]) 
3

的主要問題這個問題,是不是所有的字母可以轉換爲符號或數字。您必須創建一個字典,其中的密鑰是小寫字母,值是該字母的所有可能替換的列表:

{'a':['a','A','@'] ,...,'s':['s','S','5'],...,}

一旦你的字典被構建,其餘的只是一個簡單的Cartesian乘積正確順序的不同列表。

1

itertools.product是你搜索的內容:如果你是好奇的asterisk *手段,在這裏你是什麼

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

from itertools import product 

def getAllCombinations(password): 
    leet = ["[email protected]","Bb","Cc", "Dd","Ee","Ff","Gg","Hh","Ii","Jj","Kk", 
      "Ll","Mm","Nn","Oo0","Pp","Qq","Rr","Ss5","Tt","Uu","Vv", 
      "Ww","Xx","Yy","Zz"] 

    getPlaces = lambda password: [leet[ord(el.upper()) - 65] for el in password] 

    for letters in product(*getPlaces(password)): 
     yield "".join(letters) 

for el in getAllCombinations("Password"): 
    print el 

foggy on asterisk in python

相關問題