如何批量处理序列的元素?
例如,使用序列"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)
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)
我相信有人会想出更多的"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;
但更通用的方式(受此回答的启发):
for i in zip(*(seq[i::size] for i in range(size))):
print(i) # tuple of individual values
Run Code Online (Sandbox Code Playgroud)
然后总是有文档.
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)
注意:当给定字符串序列作为输入时,这些产生元组而不是子串.
| 归档时间: |
|
| 查看次数: |
20366 次 |
| 最近记录: |