在列表中的元素之间添加N次元素

时间:2015-04-08 01:59:56

标签: python list

我有这段代码从python: most elegant way to intersperse a list with an element散布。

def joinit(iterable, delimiter):
    it = iter(iterable)
    yield next(it)
    for x in it:
        yield delimiter
        yield x

我想做同样的事情,只是我可以在列表中的元素之间添加元素n次。

示例:

joinNTimes(3,"a",[1,2,3])

将成为

[1,"a","a","a",2,"a""a","a",3,"a","a","a"]

感谢。

6 个答案:

答案 0 :(得分:1)

您的问题更简单,因为您只需要在每个可迭代元素之后插入分隔符。

def joinNTimes(count, delimiter, iterable):
    for x in iterable:
        yield x
        for i in xrange(count):
            yield delimiter

答案 1 :(得分:1)

这是我的解决方案。我刚添加了一个额外的循环来多次产生分隔符。它没有返回最后一组分隔符,但是您发布的单个版本的代码似乎也没有。

def joinNTimes(n, delimiter, iterable):
    it = iter(iterable)
    yield next(it)
    for x in it:
        for i in xrange(n):
            yield delimiter
        yield x

答案 2 :(得分:1)

我想知道,iter(iterable)在这里有什么意义,使用它有什么好处?不能简单地说:

def joinit(count, iterable, delimiter):
    for x in iterable:
        yield x
        for _ in range(count):
            yield delimiter

list(joinit(2, [1,2,3], 'a'))

输出:

[1, 'a', 'a', 2, 'a', 'a', 3, 'a', 'a']

答案 3 :(得分:0)

你只需要另一个for循环 -

def joinNtimes(delimiter, times, iterable):
    it = iter(iterable)
    yield next(it)
    for x in it:
        for i in range(times):
            yield delimiter
        yield x

@Nix发布了相同功能的更清洁版本。您无需转换iterable

答案 4 :(得分:0)

将参数n添加到joinit()函数中,并在其中添加一个额外的循环:

def joinit_n(iterable, delimiter, n):
    it = iter(iterable)
    yield next(it)
    for x in it:
        # yield the delimiter n times instead of just once:
        for i in range(n):
            yield delimiter
        yield x

如果您确实希望在结尾n上添加分隔符,就像在您的示例中那样,那么您只想在末尾添加另一个循环:

def joinit_n(iterable, delimiter, n):
    it = iter(iterable)
    yield next(it)
    for x in it:
        # yield the delimiter n times instead of just once:
        for i in range(n):
            yield delimiter
        yield x
    # And another n delimiters at the end
    for i in range(n):
        yield delimiter

肯定有一种巧妙的方法,但可读性很重要!明确写出循环就好了。

答案 5 :(得分:0)

def joinit(iterable, delimiter):
    for x in iterable:
        yield x
        if isinstance(delimiter, list):
            for y in list(delimiter):
                yield y
        else:
            yield delimiter

list(joinit([1, 2, 3], ['a', 'a']))

返回

[1, 'a', 'a', 2, 'a', 'a', 3, 'a', 'a']

优点:joinit的语义对于单元素分隔符和多元素分隔符保持不变。函数调用者决定,而不是函数。

提示:['a', 'a']['a'] * 2list('a' * 2)

相关问题