Pythonic将一条线分成四个单词组的方式?

时间:2013-06-06 18:24:59

标签: python string

假设我的字符串看起来如下,长度不一,但“字”的数量总是等于4的倍数。

9c 75 5a 62 32 3b 3a fe 40 14 46 1c 6e d5 24 de
c6 11 17 cc 3d d7 99 f4 a1 3f 7f 4c

我想将它们分成9c 75 5a 6232 3b 3a fe

等字符串

我可以使用正则表达式来匹配确切的格式,但我想知道是否有更简单的方法来执行此操作,因为正则表达式看起来像是一个简单的问题就过度了。

4 个答案:

答案 0 :(得分:9)

这种直截了当的方式如下:

wordlist = words.split()
for i in xrange(0, len(wordlist), 4):
    print ' '.join(wordlist[i:i+4])

如果由于某种原因你无法列出所有单词(例如无限流),你可以这样做:

from itertools import groupby, izip
words = (''.join(g) for k, g in groupby(words, ' '.__ne__) if k)
for g in izip(*[iter(words)] * 4):
    print ' '.join(g)

免责声明:我没有提出这种模式;我在一段时间内发现了类似的话题。它可以说依赖于一个实现细节,但是当以不同的方式完成时会更加丑陋。

答案 1 :(得分:1)

基于itertools grouper recipe

执行该功能的稍微有效的方法
 for x in grouper(words.split(), 4):
    print ' '.join(x)

答案 2 :(得分:0)

>>> words = '9c 75 5a 62 32 3b 3a fe 40 14 46 1c 6e d5 24 de'.split()
>>> [' '.join(words[i*4:i*4+4]) for i in range(len(words)/4)]
['9c 75 5a 62', '32 3b 3a fe', '40 14 46 1c', '6e d5 24 de']

或基于1_CR的回答

from itertools import izip_longest

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(fillvalue=fillvalue, *args)

[' '.join(x) for x in grouper(words.split(), 4)]

答案 3 :(得分:0)

giantString= '9c 75 5a 62 32 3b 3a fe 40 14 46 1c 6e d5 24 de c6 11 17 cc 3d d7 99 f4 a1 3f 7f 4c'

splitGiant = giantString.split(' ')
stringHolders = []
for item in xrange(len(splitGiant)/4):
    stringHolders.append(splitGiant[item*4:item*4+4])

stringHolder2 = []

for item in stringHolders:
    stringHolder2.append(' '.join(item))

print stringHolder2
这是实现这一目标的最漫长的方式。