2012-08-03 66 views
2

我想知道什麼最好的方法是將諸如"abcdefghijklmnopqrstuvwxyz"之類的字符串拆分成2個組的列表(將字符串拆分爲:["ab", "bc", "cd", ... "yz])是Python中的一種。將字符串拆分爲特定長度的組

或者怎麼樣在3組:分裂串入["abc", "bcd", "cde", ... "xyz"]

謝謝!

+0

@jamylak,OP要求的組是_overlapping_ – 2012-08-03 06:48:16

+0

@gnibbler同意,我正在查看示例的錯覺 – jamylak 2012-08-03 06:55:14

回答

1

這是一個班輪:

def split_by_len(text, chunksize): 
    return [text[i:(i+chunksize)] for i in range(len(text)-chunksize+1)] 
+0

我不會使用'str'作爲名稱,因爲它是內置的。可能'文本'是一個更好的名字。 – jamylak 2012-08-03 06:31:42

+0

感謝您指出,我編輯了答案 – Teudimundo 2012-08-03 06:32:32

+0

不,OP希望'[「ab」,「bc」,「cd」,...「yz]',而不是'[」ab「,」cd「,」 ef「,...」yz]'。對於三胞胎,你會得到:'''abc','def','ghi','jkl','mno','pqr','stu','vwx','yz']'...最後元素太短。 – mhawke 2012-08-03 06:39:08

1
>>> groups = zip(s, s[1:], s[2:]) 
>>> ["".join(g) for g in groups] 
['abc', 'bcd', 'cde', 'def', 'efg', 'fgh', 'ghi', 'hij', 'ijk', 'jkl', 'klm', 'l 
mn', 'mno', 'nop', 'opq', 'pqr', 'qrs', 'rst', 'stu', 'tuv', 'uvw', 'vwx', 'wxy' 
, 'xyz'] 
1
def segment_string(s, segment_len): 
    return [s[i:i+segment_len] for i in range(len(s) - (segment_len - 1))] 

>>> for i in range(5): 
     print segment_string("abcdefghijklmnopqrstuvwxyz", i) 
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 
['ab', 'bc', 'cd', 'de', 'ef', 'fg', 'gh', 'hi', 'ij', 'jk', 'kl', 'lm', 'mn', 'no', 'op', 'pq', 'qr', 'rs', 'st', 'tu', 'uv', 'vw', 'wx', 'xy', 'yz'] 
['abc', 'bcd', 'cde', 'def', 'efg', 'fgh', 'ghi', 'hij', 'ijk', 'jkl', 'klm', 'lmn', 'mno', 'nop', 'opq', 'pqr', 'qrs', 'rst', 'stu', 'tuv', 'uvw', 'vwx', 'wxy', 'xyz'] 
['abcd', 'bcde', 'cdef', 'defg', 'efgh', 'fghi', 'ghij', 'hijk', 'ijkl', 'jklm', 'klmn', 'lmno', 'mnop', 'nopq', 'opqr', 'pqrs', 'qrst', 'rstu', 'stuv', 'tuvw', 'uvwx', 'vwxy', 'wxyz'] 
4

這是一個對任何迭代

>>> from itertools import tee, izip, islice 
>>> chunksize = 2 
>>> s = 'abcdefghijklmnopqrstuvwxyz' 
>>> t = tee(s, chunksize) 
>>> for i, j in enumerate(t): 
... next(islice(j, i, i), None) 
... 
>>> ["".join(k) for k in izip(*t)] 
['ab', 'bc', 'cd', 'de', 'ef', 'fg', 'gh', 'hi', 'ij', 'jk', 'kl', 'lm', 'mn', 'no', 'op', 'pq', 'qr', 'rs', 'st', 'tu', 'uv', 'vw', 'wx', 'xy', 'yz'] 

工作如果s始終是一個str,這是更直接轉發

>>> [s[i: i + chunksize] for i in range(len(s) + 1 - chunksize)] 
['ab', 'bc', 'cd', 'de', 'ef', 'fg', 'gh', 'hi', 'ij', 'jk', 'kl', 'lm', 'mn', 'no', 'op', 'pq', 'qr', 'rs', 'st', 'tu', 'uv', 'vw', 'wx', 'xy', 'yz'] 
+0

我剛剛意識到我的方法基本上與你的方法是一樣的,除了我有像'pairwise' – jamylak 2012-08-03 07:10:15