用填充迭代

时间:2014-02-05 06:16:55

标签: python loops generator

我想创建一个函数,可以遍历参数中的任何内容(指定的时间),并使用填充生成。

所以我想说我有这个功能:

def generate_with_padding(tobeiterated, n, pad = None):
     ...

如果我使用字符串调用,请说:generate_with_padding('abcdefg', 10, '?')

我希望它返回:

a
b
c
d
e
f
g
?
?
?

我不想使用索引,因为我也希望迭代生成器。我怎么处理这个?也许我可以使用next()?

4 个答案:

答案 0 :(得分:1)

itertools是最好的答案。你可以这样做

from itertools import repeat, chain, islice

def generate_with_padding(tobeiterated, n, pad = None):
    return islice(chain(tobeiterated, repeat(pad)), n)

几次测试

def generator():
    for i in xrange(1, 6):
        yield i

print list(generate_with_padding("abcd", 10, "?"))
print list(generate_with_padding([1, 2], 5))
print list(generate_with_padding(generator(), 10, 0))

<强>输出

['a', 'b', 'c', 'd', '?', '?', '?', '?', '?', '?']
[1, 2, None, None, None]
[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

注意:如果您希望输出是列表而不是迭代器,则可以替换return语句,如下所示

return list(islice(chain(tobeiterated, repeat(pad)), n))

答案 1 :(得分:0)

这已经内置到itertools module中,因此适用于所有迭代,包括生成器:

>>> import itertools
>>> a = "abcdefg"
>>> [item for item, index in itertools.izip_longest(a, xrange(10), fillvalue="?")]
['a', 'b', 'c', 'd', 'e', 'f', 'g', '?', '?', '?']

如果您使用()代替[],则会获得生成器而不是列表(我在此处用于可视化)。

答案 2 :(得分:0)

如何在foreach循环中保持计数? 我不确定这是否违反了你对“使用索引”的约束,但它确实实现了你想要的行为,并且它适用于生成器。

def generate_with_padding(tobeiterated, n, pad = None):
     count = 0
     for x in tobeiterated:
         count = count + 1
         yield x
     for _ in xrange(n - count):
         yield pad 

例如,以下内容生成所需的输出:

for i in generate_with_padding('abcdefg', 10, '?'):
   print i

答案 3 :(得分:0)

您可以根据填充方向使用ljustrjust。基本语法是:

str="Padding String";
s= str.ljust(20,'?');
l=list(s)
print(l)

输出:['P', 'a', 'd', 'd', 'i', 'n', 'g', ' ', 'S', 't', 'r', 'i', 'n', 'g', '?', '?', '?', '?', '?', '?']

您可以将参数传递给ljust函数。这是开箱即用的,您不需要导入任何东西。