根据索引将Python列表拆分为多个列表
我有一串字节,这些字节表示三维空间中的立方体。它的坐标排列方式是这样的:
[x0y0z0, x0y1z0, x0y2z0, ..., x0y127z0, x0y0z1, x0y1z1, ..., x15y127z15]
我想把这个数据分成128个列表,每个列表对应一个Y坐标。这段代码已经实现了这个功能,但我觉得效率不高。有没有什么方法可以根据索引的模(128)来分割这个列表呢?
来自原始代码:
col.extend(izip_longest(*[iter(file["Level"]["Blocks"].value)]*128))
这个过程花费了相当长的时间,我觉得可以通过避免*128
这部分来提高性能。不过,压缩方面我并不擅长,处理二进制文件也不是我的强项。
4 个回答
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)]
2
可以试试类似这样的东西
L = file["Level"]["Blocks"].value
col += [L[i::128] for i in range(127)]
3
当然可以!请看下面的内容:
在编程中,有时候我们需要让程序做一些重复的事情。比如说,我们想让程序每隔一段时间就执行某个操作。这时候,我们就可以使用“循环”这个概念。
循环就像是一个指令,让程序不停地重复某个动作,直到满足特定的条件为止。想象一下你在做一个简单的任务,比如数数:你从1开始数,一直数到10,这个过程就可以用循环来表示。
在代码中,循环通常有几种不同的类型,比如“for循环”和“while循环”。“for循环”适合在你知道要重复多少次的时候使用,而“while循环”则适合在你不知道要重复多少次,但有一个条件需要满足的情况下使用。
总之,循环是编程中非常重要的一个概念,它可以帮助我们简化代码,让程序更高效地完成任务。
如果你有任何问题或者想了解更多,随时可以问我!
# 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