可能重複:
python: most elegant way to intersperse a list with an element在列表中已經添加一個項目的每個項目之間
假設我有以下列表:
['a','b','c','d','e']
我怎麼能追加此列表中每個項目之間的新項目(本例中爲-
),以便我的列表看起來像以下?
['a','-','b','-','c','-','d','-','e']
謝謝。
可能重複:
python: most elegant way to intersperse a list with an element在列表中已經添加一個項目的每個項目之間
假設我有以下列表:
['a','b','c','d','e']
我怎麼能追加此列表中每個項目之間的新項目(本例中爲-
),以便我的列表看起來像以下?
['a','-','b','-','c','-','d','-','e']
謝謝。
list = ['a', 'b', 'c', 'd', 'e']
result = []
for e in list:
result.append(e)
result.append('-')
result.pop()
似乎工作
>>> list('-'.join(ls))
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e']
>>>
我覺得這是多了幾分優雅/ Python的,以及作爲一般。你可能會發現它的可讀性,如果你不習慣實用的風格,但:
li = ['a','b','c','d','e']
from operator import add
reduce(add, [(elt, "-") for elt in li])[:-1]
如果你願意,你可以使用拉姆達A,B:A + B,而不是operator.add。
下面是我期望的速度非常快的解決方案 - 我相信所有這些操作都將以優化的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]
適應this answer to a similar question:
>>> input = ['a', 'b', 'c', 'd', 'e']
>>> sep = ['-'] * len(input)
>>> list(sum(zip(input, sep),())[:-1])
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e']
Another answer to the same question執行此使用itertools和稍微修改的分隔符列表:
>>> import itertools
>>> sep = ['-'] * (len(input) - 1)
>>> list(it.next() for it in itertools.cycle((iter(input), iter(sep))))
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e']
下面將添加的每個那些在列表之間的「分隔符」元素:
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,這裏有可能感興趣的新聞組comp.lang.python
組在題爲Custom string joining類似的線程您。
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:]]
請注意,這僅適用於如果所有項目和分隔符是單字符字符串! – delnan 2011-05-07 11:54:20