代码之家  ›  专栏  ›  技术社区  ›  ooboo

发电机发电

  •  2
  • ooboo  · 技术社区  · 17 年前

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

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

    MY发电机(2):4 5 MY发电机(4):10 11 12 MY发电机(5):9300 500

    所以这个集合(9,10,11,12300500)与原始数字2有“距离”。如果我把它应用到数字9上,我将得到一组与原来的2之间距离为“3”的数字。

    实际上,我想要的是创建一个与给定数字具有指定距离的集合,并且在如何在Python中实现这一点上存在问题。非常感谢您的帮助:)

    3 回复  |  直到 12 年前
        1
  •  2
  •   yairchu    12 年前

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

    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]
    

    顺便说一句,哈斯克尔溶液:

    grandKids generation kidsFunc val =
      iterate (concatMap kidsFunc) [val] !! generation
    
        2
  •  3
  •   Anurag Uniyal    17 年前

    假设我们的生成器生成给定数字的平方和立方,那么它将输出唯一的 所以,如果我们想在最简单的情况下得到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]
    
        3
  •  0
  •   James Hopkin    17 年前

    我刚开始学巨蟒,所以如果我的答案看起来有点业余,请耐心等待。您可以使用一个列表列表来填充从MyGenerator函数返回的值。

    因此,例如,以2作为起始参数,您的数据结构类似于

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

    行索引应该为您提供距离,您可以使用诸如extend之类的方法向列表中添加更多数据。