一个字符串的所有可能的情况下的组合

问题描述:

我想创建一个程序来生成一个字符串在Python中所有可能的大写情况。例如,给定'abcedfghij',我想要一个程序来生成: Abcdefghij ABcdef .. 。 。 aBcdef .. 。 ABCDEFGHIJ一个字符串的所有可能的情况下的组合

等等。我试图找到一个快速的方法来做到这一点,但我不知道从哪里开始。

+1

不知道为什么downvotes在这里?明确的问题,即使不是一个明确的理由,许多更琐碎的问题都会被问到,而不是被低估? – agf

from itertools import product, izip 
def Cc(s): 
    s = s.lower() 
    for p in product(*[(0,1)]*len(s)): 
     yield ''.join(c.upper() if t else c for t,c in izip(p,s)) 

print list(Cc("Dan")) 

打印:

['dan', 'daN', 'dAn', 'dAN', 'Dan', 'DaN', 'DAn', 'DAN'] 
+0

谢谢。这是完美的。我从来没有想过这样做。我正在尝试一种递归方法,并且耗时太长。 – peacey

+4

你可以做到这一点甚至更短:产品(* zip(s.lower(),s.upper())))''返回(''.join(t)。 –

import itertools 

def comb_gen(iterable): 
    #Generate all combinations of items in iterable 
    for r in range(len(iterable)+1): 
     for i in itertools.combinations(iterable, r): 
      yield i 


def upper_by_index(s, indexes): 
    #return a string which characters specified in indexes is uppered 
    return "".join(
       i.upper() if index in indexes else i 
       for index, i in enumerate(s) 
       ) 

my_string = "abcd" 

for i in comb_gen(range(len(my_string))): 
    print(upper_by_index(my_string, i)) 

日期:

abcd Abcd aBcd abCd abcD ABcd AbCd AbcD aBCd aBcD abCD ABCd ABcD AbCD aBCD ABCD 

类似丹的解决方案,但要简单得多:

>>> import itertools 
>>> def cc(s): 
...  return (''.join(t) for t in itertools.product(*zip(s.lower(), s.upper()))) 
... 
>>> print list(cc('dan')) 
['dan', 'daN', 'dAn', 'dAN', 'Dan', 'DaN', 'DAn', 'DAN']