所以我有一串字节表示三维立方体。坐标的排序如下:
[x0y0z0, x0y1z0, x0y2z0, ..., x0y127z0, x0y0z1, x0y1z1, ..., x15y127z15]
我想把它分成128个列表,每个Y坐标一个。 This code已经做到了,但我觉得效率低下。有没有办法根据索引的mod(128)分割这个列表?
col.extend(izip_longest(*[iter(file["Level"]["Blocks"].value)]*128))
这需要相当长的时间,而且我认为应该可以通过避免*128
部分来提高性能。但压缩绝对不是我的强项,也不是二进制文件处理。
答案 0 :(得分:3)
# l = [x0y0z0, ...]
def bucketsofun(l, sp=16):
r = [[] for x in range(sp)]
for b, e in itertools.izip(itertools.cycle(r), l):
b.append(e)
return r
答案 1 :(得分:2)
这样的事可能值得尝试
L = file["Level"]["Blocks"].value
col += [L[i::128] for i in range(127)]
答案 2 :(得分:0)
Itertools也可以这样做:
from itertools import izip, izip_longest, chain
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
# you have something like this
# [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
l = list(chain.from_iterable(range(5) for _ in range(5)))
# you want to put all the 0s, 1s (every 5th element) together
print list(izip(*grouper(5, l)))
# [(0, 0, 0, 0, 0), (1, 1, 1, 1, 1), ... , (4, 4, 4, 4, 4)]