拆分并重新加入。
所以,拆分:
In [173]: "a,b,c,d".split(',')
Out[173]: ['a', 'b', 'c', 'd']
然后重新加入:
In [193]: z = iter("a,b,c,d".split(','))
In [194]: [a+b for a,b in zip(*([z]*2))]
Out[194]: ['ab', 'cd']
这是因为([z]*2) 是一个包含两个元素的列表,这两个元素都是同一个迭代器z。因此,zip 从z 获取第一个,然后是第二个元素来创建每个元组。
这也可以用作单行,因为在 [foo]*n foo 中只计算一次,无论它是变量还是更复杂的表达式:
In [195]: [a+b for a,b in zip(*[iter("a,b,c,d".split(','))]*2)]
Out[195]: ['ab', 'cd']
我还删掉了一对括号,因为一元 * 的优先级低于二元 *。
感谢@pillmuncher 指出可以使用izip_longest 对其进行扩展以处理具有奇数个元素的列表:
In [214]: from itertools import izip_longest
In [215]: [a+b for a,b in izip_longest(*[iter("a,b,c,d,e".split(','))]*2, fillvalue='')]
Out[215]: ['ab', 'cd', 'e']
(参见:http://docs.python.org/library/itertools.html#itertools.izip_longest)