我有这段代码从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"]
感谢。
答案 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'] * 2
或list('a' * 2)