вопрос понимания списка - PullRequest
5 голосов
/ 27 ноября 2010

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

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']

Ответы [ 3 ]

6 голосов
/ 27 ноября 2010

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

РЕДАКТИРОВАТЬ: Вдохновленный другим ответом:

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

return sum([[x, a] for a in y],[])

Как это работает: сумма добавит последовательность чего-либо, такПока есть __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))

Конечно, есть и другие способы: для начала, мы можем улучшить ответ Адама Розенфилда путем исключения ненужного лямбда-выражения:

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)]
1 голос
/ 27 ноября 2010
x = [1,2,3]
y = ['a', 'b', 'c', 'd']
z = []

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

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

1 голос
/ 27 ноября 2010

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

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

return reduce(lambda a,b:a+b, [[x,a] for a in y])
...