rendered paste bodydef CombinationEnumerator(listObj, selection) :
class CombEnum(object) :
def __init__(self, listObj, selection) :
assert selection <= len(listObj)
self.items = listObj
self.route = ([True, ]*selection) + [False, ]*(len(listObj)-selection)
self.selection = selection
def value(self) :
result = [ val for flag, val in zip(self.route, self.items) if flag ]
return result
def next(self) :
try :
while self.route[-1] :
self.route.pop()
while not self.route[-1] :
self.route.pop()
except :
return False
self.route[-1] = False
count = self.route.count(True)
self.route.extend( (self.selection - count) * [True,] )
padding = len(self.items) - len(self.route)
self.route.extend( padding * [False, ])
return True
if selection == 0 :
yield []
return
rotor = CombEnum(listObj, selection)
yield rotor.value()
while rotor.next() :
yield rotor.value()