2011-07-19 21 views
6

Próbuję utworzyć program, aby wygenerować wszystkie możliwe przypadki użycia wielkich liter w pythonie. Na przykład, biorąc pod uwagę 'abcedfghij', chcę programu do generowania: Abcdefghij ABcdef .. . . aBcdef .. . ABCDEFGHIJKombinacja wszystkich możliwych przypadków ciągu znaków

I tak dalej. Próbuję znaleźć szybki sposób, aby to zrobić, ale nie wiem od czego zacząć.

+1

Nie wiesz, dlaczego spadki tutaj? Jasne pytanie, nawet jeśli nie jest to jasny powód, pyta o wiele bardziej banalnych pytań, a nie jest przegłosowanych? – agf

Odpowiedz

7
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")) 

drukuje:

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

Dziękuję. To działa idealnie. Nigdy bym nie pomyślał, że zrobię to w ten sposób. Próbowałem metody rekurencyjnej i trwało to zbyt długo. – peacey

+4

Możesz to zrobić jeszcze krócej: 'return ('' .join (t) dla t w produkcie (* zip (s.lower(), s.upper())))'. –

0
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)) 

OUT:

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

podobne do rozwiązania Dana, ale znacznie prostsze:

>>> 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']
Powiązane problemy