我有此代码:
def flat_on_level1(it, d=-1, level=None):
"""
>>> list(flat_on_level1([[[['a']]]], level=3))
[['a']]
"""
if d==-1:
return list(flat_on_level1(it, d=d+1, level=level))
if d==level:
return (i for i in [it])
for x in it:
yield from flat_on_level1(x, d=d+1, level=level)
我希望和这里一样:
def flat_on_level(it, d=-1, level=None):
"""
>>> list(flat_on_level([[[['a']]]], level=3))
[['a']]
"""
if d == -1:
return list(flatt_on_level(it, d=d + 1, level=level))
if d == level:
return (i for i in [it])
res = []
for x in it:
res.extend( flat_on_level(x, d=d+1, level=level))
return res
我得到一个空清单。这是怎么回事?
感谢您像发电机一样的期待。我不明白我必须在这里再写一些文本,但是我认为,这个例子已经很清楚了这个问题。
答案 0 :(得分:2)
Yield一次只返回一个值。您需要调用yield的次数是列表长度的
答案 1 :(得分:1)
阅读
https://pythontips.com/2013/09/29/the-python-yield-keyword-explained/
基本上,您需要遍历第二个版本才能获得与调用第一个版本(具有生成器)相同的效果。
答案 2 :(得分:0)
好吧,没有很好的提示,我就明白了。这似乎是一个不错的生成器。我的问题更多是关于重新制定职能的策略,即可以屈服于一份固定的清单,而不是我在具体方面做错了。
def flat_on_level(it, d=-1, level=None):
"""
>>> list(flat_on_level([[[['a']]]], level=3))
['a']
"""
if isinstance(it, dict):
y = it.values()
else:
y = it
if not isinstance(y, collections.Iterable):
yield y
else:
for x in y:
if d == level:
yield x
else:
yield from flat_on_level(x, d=d + 1, level=level)