from copy import copy
def mrange(min_values, max_values=None):
'''
Inputs: min_values, a list/tuple with the starting values
if not given, assumed to be zero
max_values: a list/tuple with the ending values
outputs: a tuple of values
'''
if not max_values:
max_values = min_values
min_values = [0 for i in max_values]
indices_list = copy(min_values)
#Yield the (0,0, ..,0) value
yield tuple(indices_list)
while(True):
indices_list = updateIndices(indices_list, min_values, max_values)
if indices_list:
yield tuple(indices_list)
else:
break#We're back at the beginning
def updateIndices(indices_list, min_values, max_values):
'''
Update the list of indices
'''
for index in xrange(len(indices_list)-1, -1, -1):
#If the indices equals the max values, the reset it and
#move onto the next value
if not indices_list[index] == max_values[index] - 1:
indices_list[index] += 1
return indices_list
else:
indices_list[index] = min_values[index]
return False
#example
for i in mrange([2,2,1,2]):
print i
(0, 0, 0, 0)
(0, 0, 0, 1)
(0, 1, 0, 0)
(0, 1, 0, 1)
(1, 0, 0, 0)
(1, 0, 0, 1)
(1, 1, 0, 0)
(1, 1, 0, 1)
#So the rather horrid
for i in range(1):
for j in range(2):
for k in range(3):
for l in range(4):
print i, j, k, l
#reduces to
for i, j, k, l in mrange([1,2,3,4]):
print i, j, k, l