我想创建一个函数,可以遍历参数中的任何内容(指定的时间),并使用填充生成。
所以我想说我有这个功能:
def generate_with_padding(tobeiterated, n, pad = None):
...
如果我使用字符串调用,请说:generate_with_padding('abcdefg', 10, '?')
我希望它返回:
a
b
c
d
e
f
g
?
?
?
我不想使用索引,因为我也希望迭代生成器。我怎么处理这个?也许我可以使用next()?
答案 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)
您可以根据填充方向使用ljust
或rjust
。基本语法是:
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
函数。这是开箱即用的,您不需要导入任何东西。