组合迭代

大家好,大家好
我正在编写一些代码来解决Euler Project#90,我遇到了迭代特定列表的所有组合的需要。任何改进都将是最受欢迎的,但我认为带有迭代器的类将是合适的。
这是一个带有一些代码的类。

选择 | 换行 | 行号
  1. class myComb(object):
  2.  
  3.     """my interable combinatorial object"""
  4.  
  5.     def __init__(self,elements,length):
  6.  
  7.         if len(elements)>length:
  8.  
  9.             self.length=length
  10.  
  11.             self.elements=elements
  12.  
  13.             self.noEls=len(elements)
  14.  
  15.  
  16.  
  17.     def comb(self):
  18.  
  19.         """return the combination for the current index"""
  20.  
  21.         c=[]
  22.  
  23.         for i in self.index:
  24.  
  25.             c.append(self.elements[i])
  26.  
  27.         return c
  28.  
  29.  
  30.  
  31.     def __iter__(self):
  32.  
  33.         self.index=range(self.length)
  34.  
  35.         self.index[self.length-1]+=-1
  36.  
  37.         return self
  38.  
  39.  
  40.  
  41.     def next(self):
  42.  
  43.         if self.index==range(self.noEls-self.length,self.noEls):
  44.  
  45.             raise StopIteration
  46.  
  47.         i=self.length-1
  48.  
  49.         while self.index[i]==self.noEls-self.length+i:
  50.  
  51.             i+=-1
  52.  
  53.         self.index[i]+=1
  54.  
  55.         for j in range(i+1,self.length):
  56.  
  57.             self.index[j]=self.index[j-1]+1
  58.  
  59.         return self.comb()
  60.  
  61.  
  62.  
  63.  
  64.  
  65. C=myComb(["a","b","c","d","e"],3)
  66.  
  67. for i in C:
  68.  
  69.     print i 

此代码将打印出来:
['a','b','c']
['a','b','d']
['a','b','e']
['a','c','d']
['a','c','e']
['a','d','e']
['B','c','d']
['B','c','e']
['B','d','e']
['C','d','e']
这对Euler Project类型的事情很有帮助!

# 回答1


所以我觉得自己有点像个小丑,但用内置的模块迭代工具也可以做同样的事情。
它有排列、组合和乘积:
这里是
多科
但基本用法是:

选择 | 换行 | 行号
  1. In [17]: P=itertools.permutations([1,2,3])
  2.  
  3. In [18]: for p in P:
  4.    ....:     print p
  5.    ....:     
  6.    ....:     
  7. (1, 2, 3)
  8. (1, 3, 2)
  9. (2, 1, 3)
  10. (2, 3, 1)
  11. (3, 1, 2)
  12. (3, 2, 1)
  13.  

标签: python

评论已关闭