2

我有一个生成器,它将一个数字作为参数并产生其他数字。我想使用这个生成器产生的数字并将它们作为参数传递给同一个生成器,创建一个一定长度的链。

例如,mygenerator(2) 产生 5、4 和 6。将 mygenerator 应用于这些数字中的每一个,一遍又一遍地应用于产生的数字。生成器总是产生比作为参数传递的更大的数字,并且对于 2 个不同的数字将永远不会产生相同的数字。

我的发电机(2):4 5 我的发电机(4):10 11 12 我的发电机(5):9 300 500

所以集合 (9,10,11,12,300,500) 与原始数字 2 的“距离”为 2。如果我将其应用于数字 9,我将得到一组与原始数字 2 的距离为“3”的数字。

基本上我想要的是创建一个与给定数字具有指定距离的集合,但我在弄清楚如何在 Python 中做到这一点时遇到了问题。非常感谢帮助:)

4

3 回答 3

3

假设我们的生成器产生给定数字的正方形和立方体,它将输出唯一的,所以如果我们想在最简单的情况下获取 dist D 处的数字,我们可以递归地获取 dist D-1 处的数字,然后将生成器应用于它们

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)

输出是

[2]
[4, 8]
[16, 64, 64, 512]
[256, 4096, 4096, 262144, 4096, 262144, 262144, 134217728]
于 2009-06-19T09:13:34.210 回答
2

此解决方案不需要将所有结果保存在内存中:(以防它不适合内存等)

def grandKids(generation, kidsFunc, val):
  layer = [val]
  for i in xrange(generation):
    layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
  return layer

例子:

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]

顺便说一句,Haskell 中的解决方案:

grandKids generation kidsFunc val =
  iterate (concatMap kidsFunc) [val] !! generation
于 2009-06-19T09:29:45.363 回答
0

我刚刚开始学习 Python,如果我的回答看起来有点业余,请多多包涵。您可以做的是使用列表列表来填充从 myGenerator 函数返回的值。

所以例如。以 2 作为起始参数,您的数据结构将类似于

resDataSet = [[2], 
              [4, 5],
              [9, 10, 11, 12, 300 , 500]
              ...
             ]

行索引应该为您提供距离,您可以使用扩展等方法将更多数据添加到列表中。

于 2009-06-19T09:06:58.840 回答