2016-10-02 38 views
1

我很感興趣,我是否可以定義ascii_combinations列表中一行,並沒有使用我在下面的示例中使用的環...如何在Python中使用多個變量創建單線列表?

ascii_printable = [chr(count) for count in range(32, 127)] 
ascii_combinations = [] 

for x1 in ascii_printable: 
    for x2 in ascii_printable: 
     for x3 in ascii_printable: 
      ascii_combinations.append(x1 + x2 + x3) 

我想創造一切可能的3個字符組合的列表使用95個單字符ASCII字符。我使用這段代碼做了工作,但由於我設法將ascii_printable縮短爲One-Liner,我對是否可以對其他列表做同樣的事情感興趣。

+0

見'itertools.product' –

+1

ascii_combinations = [X1 + X2 + X3在ascii_printable X1爲X2的ascii_printable在ascii_printable X3] – dima

回答

2

您可以使用itertools.product作爲

from itertools import product 

ascii_printable = [chr(count) for count in range(32, 127)] 
ascii_combinations = [x1 + x2 + x3 for x1, x2, x3 in product(ascii_printable, repeat=3)] 

而且chr(count) for count in range(32, 127)

from itertools import product 
from string import printable 

ascii_combinations = [x1 + x2 + x3 for x1, x2, x3 in product(printable[:-5], repeat=3)] 

最後的方式不太明確,內涵是不錯,但有時它更容易認爲,恕我直言,在以下方面迭代圖的地圖,因此

from itertools import product 
from string import printable 
list(map(''.join, product(printable[:-5], repeat=3))) 
+0

@ PM2Ring yes,編輯謝謝 – giuscri

3

由於您要創建笛卡爾產品,因此標準方式是使用itertools.product

import itertools 

ascii_printable = [chr(count) for count in range(32, 127)] 
ascii_combinations = [x1+x2+x3 for x1, x2, x3 in itertools.product(ascii_printable, repeat=3)] 
+0

你爲什麼就不能說itertools .product(ascii_printable,repeat = 3)? – GreenAsJade

+0

@GreenAsJade,因爲我忘記了這個關鍵字參數。固定 –

+0

您可以使用'str.join'方法,例如'[''.join(t)for t in product(ascii_printable,repeat = 3)]' –

0

這導致真:

ascii_printable = [chr(count) for count in range(32, 127)] 
ascii_combinations = [] 

for x1 in ascii_printable: 
    for x2 in ascii_printable: 
     for x3 in ascii_printable: 
      ascii_combinations.append(x1 + x2 + x3) 

test = [x1+x2+x3 for x1 in ascii_printable for x2 in ascii_printable for x3 in ascii_printable] 

print(test == ascii_combinations) 
相關問題