2016-10-31 6 views
1

я пытаюсь придумать элегантный код, который создает комбинации/перестановки символов из одного символа:комбинации и перестановки символов

Э.Г. из одного символа, я хотел бы код, чтобы создать эти перестановки (порядок результата не важно):

'a' ----> ['a', 'aa', 'A', 'AA', 'aA', 'Aa'] 

не столь элегантные решения у меня до сих пор:

# this does it... 
from itertools import permutations 
char = 'a' 
p = [char, char*2, char.upper(), char.upper()*2] 
pp = [] # stores the final list of permutations 
for j in range(1,3): 
    for i in permutations(p,j): 
     p2 = ''.join(i) 
     if len(p2) < 3: 
      pp.append(p2) 
print pp 
['a', 'aa', 'A', 'AA', 'aA', 'Aa'] 

#this also works... 
char = 'a' 
p = ['', char, char*2, char.upper(), char.upper()*2] 
pp = [] # stores the final list of permutations 
for i in permutations(p,2): 
    j = ''.join(i) 
    if len(j) < 3: 
     pp.append(j) 
print list(set(pp)) 
['a', 'aa', 'aA', 'AA', 'Aa', 'A'] 

# and finally... so does this: 
char = 'a' 
p = ['', char, char.upper()] 
pp = [] # stores the final list of permutations 
for i in permutations(p,2): 
    pp.append(''.join(i)) 
print list(set(pp)) + [char*2, char.upper()*2] 
['a', 'A', 'aA', 'Aa', 'aa', 'AA'] 

Я не очень хорошо с лямбдами, и я подозреваю, что это может быть лучшее решение.

Итак, не могли бы вы помочь мне найти самый элегантный/питонический путь к желаемому результату?

ответ

1

Вы можете просто использовать itertools.product с различными repeat значениями, чтобы получить ожидаемый результат

>>> pop = ['a', 'A'] 
>>> from itertools import product 
>>> [''.join(item) for i in range(len(pop)) for item in product(pop, repeat=i + 1)] 
['a', 'A', 'aa', 'aA', 'Aa', 'AA'] 
+0

Оооо, мне это нравится. Хотя я бы сделал это, чтобы сделать его менее сложным: pop + ['.join (item) для элемента в продукте (pop, repeat = 2)] –

+0

@JayMarm Ответ, который я вам предоставил, является общим. Вы можете настроить его в соответствии с вашими потребностями. – thefourtheye