Generate from generators
我有一个生成器,它以一个数字作为参数,并生成其他的数字。我想使用这个生成器生成的数字,并将它们作为参数传递给同一个生成器,创建一个长度为的链。
例如,MyGenerator(2)生成5、4和6。将mygenerator应用于这些数字中的每一个,一次又一次地应用于生成的数字。生成器生成的数字总是比作为参数传递的数字大,对于2个不同的数字,将永远不会生成相同的数字。
MY发电机(2):4 5MY发电机(4):10 11 12MY发电机(5):9300 500
所以这个集合(9,10,11,12300500)与原始数字2有"距离"。如果我把它应用到数字9上,我将得到一组与原来的2之间距离为"3"的数字。
实际上,我想要的是创建一个与给定数字具有指定距离的集合,并且在如何在Python中实现这一点上存在问题。非常感谢您的帮助:)
假设我们的生成器生成给定数字的平方和立方,那么它将输出唯一的所以,如果我们想在最简单的情况下得到dist d的数字,我们可以递归地得到dist d-1的数字,然后将generator应用于它们。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def mygen(N): yield N**2 yield N**3 def getSet(N, dist): if dist == 0: return [N] numbers = [] for n in getSet(N, dist-1): numbers += list(mygen(n)) return numbers print getSet(2,0) print getSet(2,1) print getSet(2,2) print getSet(2,3) |
输出是
1 2 3 4 | [2] [4, 8] [16, 64, 64, 512] [256, 4096, 4096, 262144, 4096, 262144, 262144, 134217728] |
此解决方案不需要将所有结果保存在内存中:(以防它不适合内存等)
1 2 3 4 5 | def grandKids(generation, kidsFunc, val): layer = [val] for i in xrange(generation): layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer)) return layer |
例子:
1 2 3 4 5 6 | def kids(x): # children indices in a 1-based binary heap yield x*2 yield x*2+1 >>> list(grandKids(3, kids, 2)) [16, 17, 18, 19, 20, 21, 22, 23] |
顺便说一句,哈斯克尔溶液:
1 2 | grandKids generation kidsFunc val = iterate (concatMap kidsFunc) [val] !! generation |
我刚开始学Python,所以如果我的答案看起来有点业余,请耐心等待。您可以使用一个列表列表来填充从MyGenerator函数返回的值。
因此,例如,以2作为起始参数,您的数据结构类似于
1 2 3 4 5 | resDataSet = [[2], [4, 5], [9, 10, 11, 12, 300 , 500] ... ] |
行索引应该为您提供距离,您可以使用诸如extend之类的方法向列表中添加更多数据。