python:最优雅的方式来散布带有元素的列表

Cla*_*diu 25 python list

输入:

intersperse(666, ["once", "upon", "a", 90, None, "time"])
Run Code Online (Sandbox Code Playgroud)

输出:

["once", 666, "upon", 666, "a", 666, 90, 666, None, 666, "time"]
Run Code Online (Sandbox Code Playgroud)

什么是最优雅的(阅读:Pythonic)写作方式intersperse

Jef*_*ado 30

我自己会写一个发电机,但是这样:

def joinit(iterable, delimiter):
    it = iter(iterable)
    yield next(it)
    for x in it:
        yield delimiter
        yield x
Run Code Online (Sandbox Code Playgroud)

  • @claudiu我喜欢你两年后回来指出那个:) (4认同)
  • 我喜欢"joinit"的双关语,意思是"加入它"和"加入它[erable]" (3认同)

Fel*_*ing 17

itertools拯救
- 或 -
你可以在一行中使用多少次itertools功能?

from itertools import chain, izip, repeat, islice

def intersperse(delimiter, seq):
    return islice(chain.from_iterable(izip(repeat(delimiter), seq)), 1, None)
Run Code Online (Sandbox Code Playgroud)

用法:

>>> list(intersperse(666, ["once", "upon", "a", 90, None, "time"])
["once", 666, "upon", 666, "a", 666, 90, 666, None, 666, "time"]
Run Code Online (Sandbox Code Playgroud)

  • 它有点工作,但它称之为优雅. (3认同)

Sve*_*ach 13

另一个适用于序列的选项:

def intersperse(seq, value):
    res = [value] * (2 * len(seq) - 1)
    res[::2] = seq
    return res
Run Code Online (Sandbox Code Playgroud)


Jon*_*man 5

解决方案很简单,使用more_itertools.intersperse

>>> from more_itertools import intersperse
>>> list(intersperse(666, ["once", "upon", "a", 90, None, "time"]))
['once', 666, 'upon', 666, 'a', 666, 90, 666, None, 666, 'time']
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这个答案不是“写作” intersperse,它只是从另一个库中使用它。但这可能会使其他人不必重新发明轮子。