根据索引将Python列表拆分成几个列表

问题描述:

所以我得到了一个字节串,它表示三维立方体。坐标是这样排序的:根据索引将Python列表拆分成几个列表

[x0y0z0, x0y1z0, x0y2z0, ..., x0y127z0, x0y0z1, x0y1z1, ..., x15y127z15] 

我想将它分成128个列表,每个Y坐标一个。 This code已经这样做了,但我认为效率不高。有没有办法根据索引的mod(128)来拆分这个列表?

original code

col.extend(izip_longest(*[iter(file["Level"]["Blocks"].value)]*128)) 

这需要相当长的一段,我想应该可以通过避免这个*128部分,使一些性能更好。但压缩绝对不是我强大的一面,二进制文件处理也不是。

+1

你举的例子是不明确的。它是一个字符串或一个字符串的列表?你为什么显示y127?这是第127个y坐标吗?我以为只有16个。 – aaronasterling 2010-10-29 10:55:41

+2

这是含糊不清的。请提供显示实际输入数据的代码(不需要解释的伪代码)以及该数据的预期结果。 – 2010-10-29 10:57:18

+0

'* 128'部分不需要很长时间,你只需要对同一个迭代器进行128次引用 – 2010-10-29 12:33:09

# 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 
+0

b和e有更多的描述性名称吗? – l0b0 2010-10-29 12:23:50

+0

'bucket'和'element',如果你愿意的话。 – 2010-10-29 12:30:19

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)] 

喜欢的东西,这可能是值得一试

L = file["Level"]["Blocks"].value 
col += [L[i::128] for i in range(127)]