уверен, что есть, но не с простым списком понимания:
EDIT: Вдохновленный другой ответ:
y = ['a', 'b', 'c', 'd']
x = [1,2,3]
return sum([[x, a] for a in y],[])
Как это работает : sum добавит последовательность anythings, пока есть элемент __add__
, чтобы выполнить эту работу. НО, начинается с начальной суммы 0. Вы не можете добавить 0 в список, но вы можете дать sum()
еще одно стартовое значение. Здесь мы используем пустой список.
Если вместо фактического списка вам нужен только генератор, вы можете использовать itertools.chain.from_iterable
, который просто связывает кучу итераторов в один длинный итератор.
from itertools import *
return chain.from_iterable((x,a) for a in y)
или еще более itertools дружелюбные:
return itertools.chain.from_iterable(itertools.izip(itertools.repeat(x),y))
Есть и другие способы тоже, конечно: Начнем с того, что мы можем улучшить Адам Розенфельд-х answer, устраняя ненужный лямбда-выражение:
return reduce(list.__add__,([x, a] for a in y))
поскольку в списке уже есть член, который выполняет именно то, что нам нужно. Мы могли бы добиться того же с помощью map
и побочные эффекты в list.extend
:
l = []
map(l.extend,[[x, a] for a in y])
return l
Наконец, отпускает для чистого списка понимания, который, как безвкусный, как это возможно:
return [ y[i/2] if i%2 else x for i in range(len(y)*2)]
Хм, мне понравилась ваша предыдущая версия, она выглядела чище. Это выглядит менее читаемым – Falmarri 2010-11-27 02:04:38
. , , «chain.from_iterable» доступен в Python 2.6+ – mshsayem 2010-11-27 05:41:50