下面是一个采用二进制的定义(在Python中,用字符串表示,如'0b1010101'
)(或者一个简单的人可读写的版本,遗漏了0b
部分),并以字符串元组(迭代器是懒惰创建的)的迭代器形式返回范围。您可以使用list()来实现范围。
def binrange(start, stop=None):
'''
given bin strings return iterator of zeros and ones
e.g.
>>> list(binrange(bin(8))) # bin(8) returns '0b1000'
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1)]
>>> list(binrange('10', bin(4))) # bin(4) returns '0b100'
[(0, 1, 0), (0, 1, 1)]
'''
if stop is None:
start, stop = '0', start
start = start[2:] if start.startswith('0b') else start
stop = stop[2:] if stop.startswith('0b') else stop
length = len(stop)
for i in xrange(long(start, 2), long(stop, 2)): # in Python3, use range(), not xrange()
yield tuple(int(j) for j in ('{0:b}'.format(i).zfill(length)))
# above line replaces the following commented line
# yield tuple(int(j) for j in ('{0:{fill}{align}{width}b}'.format(i, fill=0, align='>', width=length)))
和
print(list(binrange(bin(1000**3), bin(1000**3+3))))
print(list(binrange('1000')))
print(list(binrange('0b100')))
打印出:
[(1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0), (1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1), (1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0)]
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1)]
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1)]
反正是有,你可以“计算”的出发点(这将是特定于您的具体使用情况) - 否则,唯一的办法就是生成价值观并放弃,直到你对它们感兴趣...... –
它只是笛卡儿的产品;如果您不需要生成其中一部分,请将您的问题分解为子集;你在这里有子部分可以用链式产品来生成。 –
它看起来像你试图在整数的两个二进制表示之间。也许只是循环一个'xrange(start,end)'并将整数转换为你需要的二进制格式? – roippi