繁体   English   中英

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

[英]add an element N times between elements in list

我有这段代码是从python散布的:最优雅的方式是用一个元素散布一个列表

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

谢谢。

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

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

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

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

我想知道,这里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']

您只需要在其中另一个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

joinit()函数添加参数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

当然,有多种方法可以巧妙地实现这一点,但是可读性很重要! 明确地写出循​​环就好了。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM