如何在一组n个字符而不是一次一个字符的情况下迭代一个字符串?

时间:2017-05-13 04:00:38

标签: python python-3.x

假设 -

string = "abcdefgh"

如果我这样做 -

for i in string:
    print (i)

我明白了 -

a
b
c
d
e
f
g

我想要的是 -

ab
bc
cd
de
ef
fg

或者我们指定的任何其他分组。有可能为此做一个功能,记住我们需要的分组吗?感谢

4 个答案:

答案 0 :(得分:2)

您可以使用zip()

>>> for i, j in zip(string, string[1:]):
...     print(i+j)
... 
ab
bc
cd
de
ef
fg
gh

作为一项功能:

def func(seq, n):
    return [''.join(item) for item in zip(*[seq[n:] for n in range(n)])]

示例:

>>> for item in func("abcdefgh", 3):
...     print(item)
... 
abc
bcd
cde
def
efg
fgh

答案 1 :(得分:1)

如果s是字符串的名称,那么这种理解就可以达到你想要的效果:

[s[i:i+2] for i in range(0, len(s) - 1)]

使用此功能,您可以轻松地在不同的行上打印字符串:

for substr in [s[i:i+2] for i in range(0, len(s) -1)]:
  print substr

可以相当容易地推广:

def subgroups(s, n):
    return [s[i:i+n] for i in range(0, len(s) - 1)]

(此功能可以类似地用于以您喜欢的任何方式打印生成的子串)

答案 2 :(得分:0)

这有效:

string = "abcdefgh"

i = 0
while i < len(string) - 1:
    print(string[i]+string[i+1])
    i += 1

结果:

ab
bc
cd
de
ef
fg
gh

如果您不想gh(您的示例中缺少它),请将while循环更改为:while i < len(string) - 2:

另一种方法(尚未发布)是通过正则表达式:

import re

print("\n".join(re.findall(r'(?=(\w\w))', 'abcdefgh')))

(?=)(超前断言)允许正则表达式模式重叠。

答案 3 :(得分:-1)

import re
def splittext(text, split_by):
    '''the regex will take a string and create groupings of n-characters plus a final grouping of any remainder. if no remainder is desired, the |.+ can be removed''' 
    return re.findall(r".{%d}|.+" % split_by, text)

ret = splittext("HELLOWORLD!", 2)
print "\n".join(ret)

一些示例输出

>>> re.findall(r".{2}",a)
['HE', 'LL', 'OW', 'OR', 'LD']
>>> re.findall(r".{2}|.{1}",a)
['HE', 'LL', 'OW', 'OR', 'LD', '!']
>>> re.findall(r".{2}|.*",a)
['HE', 'LL', 'OW', 'OR', 'LD', '!', '']
>>> re.findall(r".{2}|.+",a)
['HE', 'LL', 'OW', 'OR', 'LD', '!']
>>> print "\n".join(_)
HE
LL
OW
OR
LD
!
>>>