1

I am pretty new to python. I need your help for this:

If key size is 2. I should print all possible combination of letters of size 2.

     key = 2 => aa ab ac ad..az....ba bb bc bd..bz..... so on.....za zb zc..zz
     key = 3 => aaa aab aac...bbb bba..... so on

How to code for this in python for any given key size?

Note: it should work for any given key size.

Explore_SDN
  • 217
  • 1
  • 3
  • 10

5 Answers5

1

itertools is the library you need for most combinatorics; in this case, product:

import itertools

def permutation_with_repeats(seq, key):
    """ 
    generator that produces all permutations of length key 
    of the elements in  seq.
    seq = list('abc'); key = 4
    >>> aaaa aaab aaac aaba aabb aabc aaca aacb...
    seq = list('abcdefghijklmnopqrstuvwzyz'); key = 2
    >>> aa ab ac ad ae af ag ah ai aj ak al...
    """
    for _ in  itertools.product(seq, repeat=key):
        yield ''.join(_)

seq = list('abcdefghijklmnopqrstuvwzyz')
key = 2
a = permutation_with_repeats(seq, key)  # seq and key of arbitrary size > 0

while True:
    try:
        print(next(a), end=' ')
    except StopIteration:
        break

output:

aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw az ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bz by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cz cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dz dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ez ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fz fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gz gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hz hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw iz iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jz jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kz ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lz ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mz my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nz ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow oz oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw pz py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qz qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rz ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sz sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tz ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw uz uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vz vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wz wy wz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zz zy zz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yz yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zz zy zz aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw az ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bz by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cz cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dz dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ez ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fz fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gz gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hz hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw iz iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jz jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kz ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lz ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mz my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nz ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow oz oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw pz py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qz qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rz ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sz sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tz ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw uz uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vz vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wz wy wz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zz zy zz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yz yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zz zy zz

itertools lets you create a generator expression that will yield each next item in lexicographic order without maintaining a large collection in memory.

Reblochon Masque
  • 35,405
  • 10
  • 55
  • 80
1

You need to use itertools.

import itertools

a=(''.join(x) for x in  itertools.product('abcd', repeat=3))

for t in a:
    print t

Here a is a generator. It doesn't eat up memory as it generates the values on demand. repeat argument indicates how long you want the generated string to be (1 - one letter [a-d], 2 - two letters [aa-dd], etc).

ForceBru
  • 43,482
  • 10
  • 63
  • 98
0
import itertools
print(*map(''.join, itertools.product('abcd', repeat=3)))
Huazuo Gao
  • 1,603
  • 14
  • 20
0

looks like you want permutations with repetition.

You can use product for that from intertools

def perm_Rep(n, r):

    import string

    from itertools import product

    elements = string.ascii_letters.upper()[:n]

    assert(r <= n), "r can't be greater than n !!!"

    for x in  product(elements, repeat=r):
        yield ''.join(x)

from 5 letters: ABCDE choose 3

for el in (perm_Rep(5, 3)):

print(el)

AAA AAB AAC AAD AAE ABA ABB ABC ABD ABE ACA ACB ACC ACD ACE ADA ADB ADC ADD ADE AEA AEB AEC AED AEE BAA BAB BAC BAD BAE BBA BBB BBC BBD BBE BCA BCB BCC BCD BCE BDA BDB BDC BDD BDE BEA BEB BEC BED BEE CAA CAB CAC CAD CAE CBA CBB CBC CBD CBE CCA CCB CCC CCD CCE CDA CDB CDC CDD CDE CEA CEB CEC CED CEE DAA DAB DAC DAD DAE DBA DBB DBC DBD DBE DCA DCB DCC DCD DCE DDA DDB DDC DDD DDE DEA DEB DEC DED DEE EAA EAB EAC EAD EAE EBA EBB EBC EBD EBE ECA ECB ECC ECD ECE EDA EDB EDC EDD EDE EEA EEB EEC EED EEE

LetzerWille
  • 5,355
  • 4
  • 23
  • 26
-1

What you have here is a classic permutation problem.

Check this previous Stack Overflow answer for some ideas -- the only difference is for you, you'll feed it the alphabet, instead of his list of numbers.

Community
  • 1
  • 1
renderf0x
  • 179
  • 6