2016-10-02 2 views
1

мне было интересно, смогу ли я определить ascii_combinations список в одной строке, а не с помощью петли я использовал в следующем примере ...Как сделать список одно Liner с несколькими переменными в 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 для x1 в ascii_printable для x2 в ascii_printable для x3 в ascii_printable] – 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 да, отредактировано спасибо – 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) для t в продукте (ascii_printable, repeat = 3)] ' –

0

Это приводит к True:

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) 
Смежные вопросы