2011-07-26 18 views
3

我试图做一个简单的字典生成器。它的工作原理,但它不是很有用。在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

一个很好的问题顺便说一句,'导入字符串; 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',等等)复制的。

dict_gen()将返回一个发电机,但你永远可以把它传递到list()如果你需要通过索引来访问元素:

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

相关问题