我有一个列表l =[253, 59, 2, 0, 0, 0, 0, 0]
,我想为列表中的每个元素设置一个(0, 255)
的范围。我想在python中实现它。我想递增*********************************************************************
每次迭代后的输出应如下所示:
l =[253, 59, 2, 0, 0, 0, 0, 0]
l =[254, 59, 2, 0, 0, 0, 0, 0]
l =[255, 59, 2, 0, 0, 0, 0, 0]
l =[0, 60, 2, 0, 0, 0, 0, 0]
l =[1, 60, 2, 0, 0, 0, 0, 0]
.
.
.
.
l =[255, 60, 2, 0, 0, 0, 0, 0]
l =[0, 61, 2, 0, 0, 0, 0, 0]
5条答案
按热度按时间lb3vh1jj1#
单向循环:
或者,递归解决方案:
jjhzyzn02#
tl;dr:一行程序(仅在小端序计算机上有效)为
1-以64位计数
从另一个Angular 来看,你似乎在计算一个代表64位整数的8个字节的列表,小字节序...为什么不这样做呢?
事实上,这个答案并不比其他答案快。我猜测,它甚至慢得多(还没有计时。但是,嗯,它显然更复杂)。
但是如果您想要的只是一个计数器,那么您可以通过只保留一个整数作为状态值来简化,并生成列表
2-迭代器
3-结构(使用内部表示)
如果您相信您使用的是基于二进制小字节序的机器(二进制,好吧,在这个世界上,我想所有的机器都是.小字节序的,不是所有的,但可能是您的),那么您甚至可以依靠cpu来完成这一任务
或者在迭代器的for中
第一个
说明
bytes(l)
是包含l
中8个字节的字节数组bytes(l) -> b'\xfe\xff\x00\x00\x01\x00\x00\x00'
这8个字节是一个数字的64位表示。我们可以通过
struct.unpack
提取,指定格式l
(64位整数)struct.unpack('l', bytes(l)) → (4295032830,)
它是元组的形式,因为我们可以要求一系列不同的数字。
struct.unpack('l', bytes(l))[0] → 4295032830
我们可以增加它
struct.unpack('l', bytes(l))[0]+1 → 4295032831
我们可以使用
pack
得到这个新整数的64位字节数组表示struct.pack('l',struct.unpack('l', bytes(l))[0]+1) → b'\xff\xff\x00\x00\x01\x00\x00\x00'
这个bytes数组只是0到255之间的数字,我们可以很容易地将其转换为列表
list(struct.pack('l',struct.unpack('l', bytes(l))[0]+1)) → [255, 255, 0, 0, 1, 0, 0, 0]
1l5u6lss3#
这个问题等价于在基数为256的位置数制中寻找连续整数的表示(但也可以使用混合基数)。
numpy
拆开和解开对于较小的列表,您可以找到
l = [253, 59, 2, 0]
形式的整数然后使用np.unravel_index返回第一个整数的表示,比如说,5个整数:
大型案例
在您的例子中,dimension =
[256] * 8
是必需的。这太大了,因为整数不能超过numpy
中的2**63
,并且会抛出ValueError
。在这种情况下,您可以实现自己的方式来替换np.ravel_multi_index
和np.unravel_index
:请注意,在所有情况下只需要8次迭代,因此它应该比仅用Python的方式更快。
xxls0lw84#
对于循环,
nc1teljy5#
纯Python皮款式:
输出量: