关于python:从生成器生成

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之类的方法向列表中添加更多数据。