以n的倍数迭代一个python序列?

25 python iteration

如何批量处理序列的元素?

例如,使用序列"abcdef"和批量大小为2,我想执行以下操作:

for x, y in "abcdef":
    print "%s%s\n" % (x, y)
ab
cd
ef
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,因为它期望列表中的单个元素本身包含2个元素.

什么是一个漂亮,简短,干净,pythonic的方式来处理批处理列表中的下一个n个元素,或者从一个更大的字符串处处理长度为n的子字符串(两个类似的问题)?

rpr*_*rpr 46

生成器功能很整洁:

def batch_gen(data, batch_size):
    for i in range(0, len(data), batch_size):
            yield data[i:i+batch_size]
Run Code Online (Sandbox Code Playgroud)

使用示例:

a = "abcdef"
for i in batch_gen(a, 2): print i
Run Code Online (Sandbox Code Playgroud)

打印:

ab
cd
ef
Run Code Online (Sandbox Code Playgroud)

  • 更一般:def batch_gen(data,batch_size): (2认同)

Sil*_*ish 13

我有一种替代方法,适用于没有已知长度的迭代.

   
def groupsgen(seq, size):
    it = iter(seq)
    while True:
        values = ()        
        for n in xrange(size):
            values += (it.next(),)        
        yield values    
Run Code Online (Sandbox Code Playgroud)

它的工作原理是迭代序列(或其他迭代器)的大小组,收集元组中的值.在每个组的末尾,它产生元组.

当迭代器用完值时,它会产生一个StopIteration异常,然后向上传播,表明groupsgen超出了值.

它假设值以大小集合(集合2,3等).如果没有,剩下的任何值都会被丢弃.


Jas*_*oon 10

不要忘记zip()函数:

a = 'abcdef'
for x,y in zip(a[::2], a[1::2]):
  print '%s%s' % (x,y)
Run Code Online (Sandbox Code Playgroud)


Pao*_*ino 9

我相信有人会想出更多的"Pythonic"但是怎么样:

for y in range(0, len(x), 2):
    print "%s%s" % (x[y], x[y+1])
Run Code Online (Sandbox Code Playgroud)

请注意,这只有在您知道的情况下才有效 len(x) % 2 == 0;


Sil*_*ost 6

但更通用的方式(受此回答的启发):

for i in zip(*(seq[i::size] for i in range(size))):
    print(i)                            # tuple of individual values
Run Code Online (Sandbox Code Playgroud)


tzo*_*zot 6

然后总是有文档.

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    try:
        b.next()
    except StopIteration:
        pass
    return izip(a, b)

def grouper(n, iterable, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)
Run Code Online (Sandbox Code Playgroud)

注意:当给定字符串序列作为输入时,这些产生元组而不是子串.