Подтвердить что ты не робот

Добавить элемент между каждым элементом, уже включенным в список

Возможный дубликат:
python: самый элегантный способ пересечения списка с элементом

Предполагая, что у меня есть следующий список:

['a','b','c','d','e']

Как добавить новый элемент (в данном случае a -) между каждым элементом в этом списке, чтобы мой список выглядел следующим образом:

['a','-','b','-','c','-','d','-','e']

Спасибо.

4b9b3361

Ответ 1

Здесь решение, которое я ожидал бы очень быстро, я считаю, что все эти операции будут выполняться с оптимизированной скоростью c.

def intersperse(lst, item):
    result = [item] * (len(lst) * 2 - 1)
    result[0::2] = lst
    return result

Испытано:

>>> l = [1, 2, 3, 4, 5]
>>> intersperse(l, '-')
[1, '-', 2, '-', 3, '-', 4, '-', 5]

Ответ 2

>>> list('-'.join(ls))
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e']
>>> 

Ответ 3

list = ['a', 'b', 'c', 'd', 'e']
result = []
for e in list:
    result.append(e)
    result.append('-')
result.pop()

похоже, работает

Ответ 4

Это должно работать с любыми элементами списка:

>>> sep = '-'
>>> ls = [1, 2, 13, 14]
>>> sum([[i, '-'] for i in ls], [])[:-1]
[1, '-', 2, '-', 13, '-', 14]

Ответ 5

li = ['a','b','c','d','e']
for i in xrange(len(li)-1,0,-1):
    li[i:i] = '-'

или

from operator import concat
seq = ['a','b','c','d','e']
print reduce(concat,[['-',x] for x in seq[1:]],seq[0:1])

или

li = ['a','b','c','d','e']
newli = li[0:1]
[ newli.extend(('-',x)) for x in li[1:]]

Ответ 6

Я думаю, что это немного более элегантно/питонодно, а также вообще. Вы можете считать это менее читаемым, если вы не привыкли к функциональному стилю:

li = ['a','b','c','d','e']

from operator import add
reduce(add, [(elt, "-") for elt in li])[:-1]

Если вам нравится, вы можете использовать lambda a, b: a + b вместо operator.add.

Ответ 7

Адаптация этого ответа к аналогичному вопросу:

>>> input = ['a', 'b', 'c', 'd', 'e']
>>> sep = ['-'] * len(input)
>>> list(sum(zip(input, sep), ())[:-1])
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e']

Другой ответ на тот же вопрос делает это с помощью itertools и слегка измененного списка разделителей:

>>> import itertools
>>> sep = ['-'] * (len(input) - 1)
>>> list(it.next() for it in itertools.cycle((iter(input), iter(sep))))
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e']

Ответ 8

Далее будет добавлен элемент "separator" между каждым из них в списке:

seq = ['a','b','c','d','e']

def tween(seq, sep):
    return reduce(lambda r,v: r+[sep,v], seq[1:], seq[:1])

print tween(seq, '-')

выход:

['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e']

FWIW, здесь похожая тема под названием Пользовательская цепочка, соединяющая в группе Usenet comp.lang.python, которая может вас заинтересовать.