根据索引将Python列表拆分为多个列表

时间:2010-10-29 10:39:08

标签: python list

所以我有一串字节表示三维立方体。坐标的排序如下:

[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部分来提高性能。但压缩绝对不是我的强项,也不是二进制文件处理。

3 个答案:

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