Pythonic的方式插入每个2个元素的string
是否有一种python的方式插入一个元素到string中的每个第二个元素?
我有一个string:'aabbccdd',我想最终的结果是'aa-bb-cc-dd'。
我不知道如何去做这件事。
假设string的长度总是偶数,
>>> s = '12345678' >>> t = iter(s) >>> '-'.join(a+b for a,b in zip(t, t)) '12-34-56-78' 
  t也可以用来消除 
 >>> '-'.join(a+b for a,b in zip(s[::2], s[1::2])) '12-34-56-78' 
 该algorithm是将string分组成对,然后用-字符连接它们。 
代码是这样写的。 首先,它被分成奇数和偶数。
 >>> s[::2], s[1::2] ('1357', '2468') 
 然后使用zip函数将它们组合成可迭代的元组。 
 >>> list( zip(s[::2], s[1::2]) ) [('1', '2'), ('3', '4'), ('5', '6'), ('7', '8')] 
但元组不是我们想要的。 这应该是一个string列表。 这是列表理解的目的
 >>> [a+b for a,b in zip(s[::2], s[1::2])] ['12', '34', '56', '78'] 
 最后我们使用str.join()来组合列表。 
 >>> '-'.join(a+b for a,b in zip(s[::2], s[1::2])) '12-34-56-78' 
第一块代码是相同的想法,但如果string很长,则消耗较less的内存。
 >>> s = 'aabbccdd' >>> '-'.join(s[i:i+2] for i in range(0, len(s), 2)) 'aa-bb-cc-dd' 
如果你想保留最后一个字符,如果string有奇数的长度,那么你可以修改KennyTM的答案来使用itertools.izip_longest :
 >>> s = "aabbccd" >>> from itertools import izip_longest >>> '-'.join(a+b for a,b in izip_longest(s[::2], s[1::2], fillvalue="")) 'aa-bb-cc-d' 
要么
 >>> t = iter(s) >>> '-'.join(a+b for a,b in izip_longest(t, t, fillvalue="")) 'aa-bb-cc-d' 
这一个class轮是诀窍。 如果你的string有奇数个字符,它将删除最后一个字符。
 "-".join([''.join(item) for item in zip(mystring1[::2],mystring1[1::2])]) 
这里是一个列表理解的方式,其中条件值取决于枚举模数,奇数的最后一个字符将单独在组中:
 for s in ['aabbccdd','aabbccdde']: print(''.join([ char if not ind or ind % 2 else '-' + char for ind,char in enumerate(s) ] ) ) """ Output: aa-bb-cc-dd aa-bb-cc-dd-e """