2016-10-31 34 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'] 

我我不认为这可能是一个更好的解决方案。

那么,你能帮我找到最理想的/ pythonic的方式来达到预期的效果吗?

回答

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)for product in product(pop,repeat = 2)] –

+0

@JayMarm我提供的答案是一个通用的答案。您可以根据自己的需求进行定制。 – thefourtheye