取四个项目而不是在for循环

取四个项目而不是在for循环

问题描述:

我有一个字节数组,我想要做的是从数组中取4个字节,做一些事情,然后接下来的四个字节。完全可能这样做是列表理解还是让循环从数组中取出四个项目而不是一个?取四个项目而不是在for循环

+0

可能的重复[你如何将一个列表分割成Python中大小均匀的块?](http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized python) – tzot 2011-05-09 19:22:53

另一种选择是使用itertools

http://docs.python.org/library/itertools.html

通过使用石斑鱼()方法

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 

def clumper(s, count=4): 
    for x in range(0, len(s), count): 
     yield s[x:x+count] 

>>> list(clumper("abcdefghijklmnopqrstuvwxyz")) 
['abcd', 'efgh', 'ijkl', 'mnop', 'qrst', 'uvwx', 'yz'] 
>>> list(clumper("abcdefghijklmnopqrstuvwxyz", 5)) 
['abcde', 'fghij', 'klmno', 'pqrst', 'uvwxy', 'z'] 
+0

只有当你使用Python 3时,使用'range'才是正确的(并且不清楚OP是否需要*对于Py3k或者对于2而言)。在Python 2中,'range'创建一个充满整数的列表,您应该使用'xrange'来返回一个迭代器。 – 2011-04-15 12:31:51

+0

这两个代码工作正常。使用范围仍然可以在Python 2中工作,它可能会使用更多的内存。但它也可能运行得更快。在我关心之前,我需要处理的序列至少有数千万个项目。 – 2011-04-15 12:38:56

+0

为什么还要用发电机呢? – 2011-04-15 12:39:49

suxmac2:Music ajung$ cat xx.py 
lst = range(20) 

for i in range(0, len(lst)/4): 
    print lst[i*4 : i*4+4] 

suxmac2:Music ajung$ python2.5 xx.py 
[0, 1, 2, 3] 
[4, 5, 6, 7] 
[8, 9, 10, 11] 
[12, 13, 14, 15] 
[16, 17, 18, 19] 

在一个线

x="12345678987654321" 
y=[x[i:i+4] for i in range(0,len(x),4)] 
print y 
+0

我已经使用Python好几年了,我从不知道'range'可能会有第三个参数。 – 2011-04-15 18:22:28