2011-07-26 3 views
3

私はシンプルなdictジェネレータを作ろうとしています。それは動作しますが、まだそれほど機能的ではありません。この非常に単純な辞書ジェネレータをPythonで改善する

コードに触れずに出力の最大サイズを変更できるようにして、改善したいと考えています。

letr='abcdefghijklmnopqrstuvwxyz' 
for i in range(len(letr)): 
    t=letr[i] 
    print t 
    for t2 in letr: 
     print t+t2 
     for t3 in letr: 
      print t+t2+t3 
      for t4 in letr: 
       print t+t2+t3+t4 
       for t5 in letr: 
        print t+t2+t3+t4+t5 
+1

これはところでcodereview.stackexchange.com –

+0

のために良い質問のようになります。

dict_gen()は、発電機を返却しますが、インデックスで要素にアクセスする必要がある場合は、常にちょうどlist()にそれを渡すことができますインポート文字列。 string.lowercase'だから、もう一度アルファベットを入力する必要はありません:p – Hassek

答えて

4
import itertools 

def dict_gen(n): 
    letr = 'abcdefghijklmnopqrstuvwxyz' 
    return itertools.chain(''.join(j) for i in range(n) 
          for j in itertools.product(letr, repeat=i+1)) 

使用法:他の回答の一部とは異なり

for word in dict_gen(n): # replace n with the max word length you want 
    print word 

これはあなたの例( 'AA'、 'BB'、など)のような重複が含まれます。 '、

>>> words = list(dict_gen(5)) 
>>> len(words) == 26 + 26**2 + 26**3 + 26**4 + 26**5 # verify correct length 
True 
>>> words[20:30] # transition from one letter to two letters 
['u', 'v', 'w', 'x', 'y', 'z', 'aa', 'ab', 'ac', 'ad'] 
>>> words[-10:] # last 10 elements 
['zzzzq', 'zzzzr', 'zzzzs', 'zzzzt', 'zzzzu', 'zzzzv', 'zzzzw', 'zzzzx', 'zzzzy', 'zzzzz'] 
+0

ニース!すべての回答は良いですが、あなたの回答は最速です。 'python dict.py | grep -i zzzzz'は私のラップトップで9秒かかります。 –

1
letr = ''.join(chr(o) for o in range(ord('a'), ord('z') + 1)) 
import itertools 
print [''.join(word) for word in itertools.permutations(letr, 5)] 
1

Itertoolsあなたの親友です。

>>> import itertools 
>>> gen = ("".join(i) for i in itertools.permutations(letr, 5)) 
>>> list(gen)[-10:] 
['zyxwm', 'zyxwn', 'zyxwo', 'zyxwp', 'zyxwq', 'zyxwr', 'zyxws', 'zyxwt', 'zyxwu', 'zyxwv'] 

あなたはすべてのpermuationsを取得したい場合は、発電機を自分で書くことができます:

import itertools 

def perms(seq): 
    for n in range(len(seq)+1): 
     for i in itertools.permutations(seq, n): 
      yield i 

は、詳細はitertoolsや発電用のPythonドキュメントを参照してください。

+0

彼は順列であり、組み合わせではありません。 – stefan

+0

@stefan、感謝、編集された答え。 – utdemir

関連する問題