from itertools import groupby, islice
def morris():
morris = '1'
yield morris
while True:
morris = groupby(morris)
morris = ((len(list(group)), key) for key, group in morris)
morris = ((str(l), k) for l, k in morris)
morris = ''.join(''.join(t) for t in morris)
yield morris
print list(islice(morris(), 10))
首先我会做迭代无限,让消费者决定,他的量有多大希望。这样他就可以得到每一个比x短的莫里斯数字或者第一个x数字等。
然后显然没有必要把以前morris数字的整个列表存储在一个列表中,因为递归只是无论如何,它们都是n := f(n-1)
。
最后,使用itertools给它的功能的触摸总是值得一极客点或两个;)我分裂发生器表达成几行,以使在眼睛上它更容易一些。
这个解决方案的主要丑陋来自于这样一个事实,即len()
不能在迭代器上调用,并给我们一个int,我们需要一个str。另hickup是嵌套str.join)再次拉平了整个事情变成一个海峡。
如果你想开始从任意的数字序列,这样定义的功能:如果你想转身即发电机
def morris(morris=None):
if morris is None:
morris = '1'
[...]
,你可以写这样的:
def morris():
morris = '1'
yield morris
while True:
print morris
morris = ''.join(''.join(t)
for t in ((str(len(list(group))), key)
for key, group in groupby(morris)))
yield morris
我不确定我喜欢分成两个功能,但这似乎是最可读的解决方案:
def m_groupby(s):
for key, group in groupby(s):
yield str(len(list(group)))
yield key
def morris():
morris = '1'
yield morris
while True:
morris = ''.join(m_groupby(morris))
yield morris
希望你喜欢它!
来源
2009-02-16 18:01:25
hop
这听起来像哟你在问鱼拍舞蹈。结合巨蟒和莫里斯舞... :-) – 2009-02-16 16:29:32
如果这件事情并不需要至少10个字符我会一直只是回应道:d – 2009-02-16 16:30:39