【问题标题】:Taking four items instead of on in a for loop在 for 循环中取四个项目而不是 on
【发布时间】:2011-04-15 11:53:31
【问题描述】:

我有一个字节数组,我想做的是从数组中取出四个字节,用它做一些事情,然后取出接下来的四个字节。是否有可能做到这一点是列表理解或使 for 循环从数组中获取四个项目而不是一个?

【问题讨论】:

标签: python python-3.x


【解决方案1】:

另一个选项是使用 itertools

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

通过使用 grouper() 方法

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

【讨论】:

    【解决方案2】:
    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']
    

    【讨论】:

    • 使用 range 仅在您使用 Python 3 时是正确的(并且不清楚 OP 是否需要 just 用于 Py3k 或 2)。在 Python 2 中,range 创建一个充满整数的列表,您应该使用 xrange 来返回一个迭代器。
    • 代码在两者中都可以正常工作。在 Python 2 中使用 range 仍然有效,只是可能会使用更多内存。但它也可能运行得更快。在我关心之前,我需要处理至少数千万个项目的序列。
    • 那为什么还要使用生成器呢?
    • 因为与整数列表相比,我只需要处理几十万个项目的序列,然后我才关心制作通用对象列表的列表。
    【解决方案3】:

    一行

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

    【讨论】:

    • 我已经使用 Python 多年了,我从来不知道 range 可以接受第三个参数。
    【解决方案4】:
    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2018-11-21
      • 1970-01-01
      • 2018-07-08
      • 2021-12-25
      相关资源
      最近更新 更多