三次迭代一个字符串
Iterating Over a String in Threes
假设我有字符串:
string = 'ABCDEFGHI'
我想遍历字符串,因此输出将是:
ABC
DEF
GHI
这可行吗?我可以按照以下方式做一些事情吗:
for i in string, 3:
print i
我觉得我缺少一个更简单的解决方案。
完成此操作的简单 for
循环是:
for i in range(3, len(string) + 1, 3):
print string[i-3:i]
它使用 step=3
value for range()
to iterate by 3's
and then, utilizing a slice
对象,该对象取决于 i
的值,您将获得结果切片字符串。对于 string = 'ABCDEFGHI'
这打印:
ABC
DEF
GHI
当然你可以用一个变量删除硬编码的3
,比如gap = 3
使循环更美观:
gap = 3
for i in range(gap, len(string) + 1, gap):
print string[i-gap: i]
您可以像这样创建一个生成器函数:
def trios(seq):
result = []
for e in seq:
result.append(e)
if len(result) == 3:
yield result
result = []
if result:
yield result
然后像这样使用它:
>>> string = "ABCDEFGHIJ"
>>> [t for t in trios(string)]
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I'], ['J', 'K']]
如果字符串不能被三整除,则最终元素将包含少于三个字符。如果你宁愿把它们扔掉,你可以这样写生成器:
def trios(seq):
result = []
for e in seq:
result.append(e)
if len(result) == 3:
yield result
result = []
查看 grouper
recipe on the itertools
文档。如所写,它 returns tuple
s,不是新的 str
s,但它的适应性很简单:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(*args, fillvalue=fillvalue)
唯一的调整是包装最后一行,使其将 tuple
s zip_longest
的结果转换回 str
:
return map(''.join, izip_longest(*args, fillvalue=fillvalue))
假设我有字符串:
string = 'ABCDEFGHI'
我想遍历字符串,因此输出将是:
ABC
DEF
GHI
这可行吗?我可以按照以下方式做一些事情吗:
for i in string, 3:
print i
我觉得我缺少一个更简单的解决方案。
完成此操作的简单 for
循环是:
for i in range(3, len(string) + 1, 3):
print string[i-3:i]
它使用 step=3
value for range()
to iterate by 3's
and then, utilizing a slice
对象,该对象取决于 i
的值,您将获得结果切片字符串。对于 string = 'ABCDEFGHI'
这打印:
ABC
DEF
GHI
当然你可以用一个变量删除硬编码的3
,比如gap = 3
使循环更美观:
gap = 3
for i in range(gap, len(string) + 1, gap):
print string[i-gap: i]
您可以像这样创建一个生成器函数:
def trios(seq):
result = []
for e in seq:
result.append(e)
if len(result) == 3:
yield result
result = []
if result:
yield result
然后像这样使用它:
>>> string = "ABCDEFGHIJ"
>>> [t for t in trios(string)]
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I'], ['J', 'K']]
如果字符串不能被三整除,则最终元素将包含少于三个字符。如果你宁愿把它们扔掉,你可以这样写生成器:
def trios(seq):
result = []
for e in seq:
result.append(e)
if len(result) == 3:
yield result
result = []
查看 grouper
recipe on the itertools
文档。如所写,它 returns tuple
s,不是新的 str
s,但它的适应性很简单:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(*args, fillvalue=fillvalue)
唯一的调整是包装最后一行,使其将 tuple
s zip_longest
的结果转换回 str
:
return map(''.join, izip_longest(*args, fillvalue=fillvalue))