2010-11-27 2 views
5

Есть ли способ добавить несколько элементов в список в понимании списка за итерацию? Например:список понимание вопрос

y = ['a', 'b', 'c', 'd'] 
x = [1,2,3] 

return [x, a for a in y] 

выход: [[1,2,3], 'a', [1,2,3], 'b', [1,2,3], 'c', [1,2,3], 'd']

ответ

6

уверен, что есть, но не с простым списком понимания:

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)] 
+0

Хм, мне понравилась ваша предыдущая версия, она выглядела чище. Это выглядит менее читаемым – Falmarri 2010-11-27 02:04:38

+0

. , , «chain.from_iterable» доступен в Python 2.6+ – mshsayem 2010-11-27 05:41:50

1

Вот один из способов:

y = ['a', 'b', 'c', 'd'] 
x = [1,2,3] 

return reduce(lambda a,b:a+b, [[x,a] for a in y]) 
1
x = [1,2,3] 
y = ['a', 'b', 'c', 'd'] 
z = [] 

[z.extend([x, a]) for a in y] 

(Правильное значение будет в z)

Смежные вопросы