Разделить и вернуться.
Итак, разделить:
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)