2017-05-13 66 views
0

假設 -如何迭代一個字符串中的n個字符組而不是一次一個字符?

string = "abcdefgh" 

如果我這樣做 -

for i in string: 
    print (i) 

我得到 -

a 
b 
c 
d 
e 
f 
g 

我要的是一樣的東西 -

ab 
bc 
cd 
de 
ef 
fg 

或以其他任何按我們的規格分組IFY。爲了記住我們需要的分組,我們可以做一個函數嗎?由於

+0

相關:http://stackoverflow.com/questions/312443/how-do-you-split-a-list-成均勻大小的塊 – TerryA

回答

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'))) 

(?=)(前向斷言),允許正則表達式模式重疊。

-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 
! 
>>>  
+0

這不是他們想要的... – Li357

+0

聰明。不幸的是,聰明通常是一個壞主意的標誌。 –

+0

你最初的例子幾乎是正確的,你只需要添加'overlapped = True',看[這裏](http://stackoverflow.com/a/18966698/1695437)。或者,你可以使用前瞻斷言('(?=)')。 – Darkstarone

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

如果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)] 

(並且此功能可以類似地用於以您喜歡的任何方式打印所得到的子串)

+0

這不是OP想要的 – TerryA

+0

這會返回'['ab','cd','ef ','gh']',其中不包括重疊。 – Darkstarone

+1

夠公平的。固定。 –

相關問題