2

引数として数値を取り、他の数値を生成するジェネレーターがあります。このジェネレーターによって生成された数値を使用し、それらを引数として同じジェネレーターに渡して、ある程度の長さのチェーンを作成したいと思います。

たとえば、mygenerator(2)は5、4、および6を生成します。これらの各数値にmygeneratorを適用し、生成された数値に繰り返し適用します。ジェネレーターは常に引数として渡された数よりも大きな数を生成し、2つの異なる数に対して同じ数を生成することはありません。

mygenerator(2):4 5 mygenerator(4):10 11 12 mygenerator(5):9300500

したがって、セット(9,10,11,12,300,500)は、元の数値2から「距離」2になります。これを数値9に適用すると、元の2から距離「3」の数値のセットが得られます。

基本的に私が欲しいのは、与えられた数から指定された距離を持つセットを作成することであり、Pythonでそれを行う方法を理解するのに問題があります。感謝します:)

4

3 に答える 3

3

ジェネレーターが与えられた数値の平方と立方体を生成し、一意に出力されると仮定すると、最も単純なケースで距離 D の数値を取得したい場合、距離 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]
              ...
             ]

行インデックスは距離を示す必要があり、extendなどのメソッドを使用してリストにデータを追加できます。

于 2009-06-19T09:06:58.840 に答える