0

セットアップとして関数の戻り値を比率で回転させます。現在、優先キューのようなものを使用してこれを機能させていますが、これを行うための優れたパフォーマンスpythonistaの方法は何ですか。

これは、関数がどのように機能する必要があるかの例です

私はセットアップしました:

value  | ratio
A        2
B        1
C        3

関数はその設定を使用します。

setup = {'A': 2, 'B': 1, 'C': 3} #create from setup above
def process():
    ...
    value = ...
    return value

関数を呼び出すたびに結果が得られます。

process()
>>> A
process()
>>> A
process()
>>> B
process()
>>> C
process()
>>> C
process()
>>> C
process()
>>> A
process()
>>> A
process()
>>> B
process()
>>> C
... #and so on
4

4 に答える 4

4

あなたprocess()は怠惰な評価に対して非常にオープンです。ジェネレーターを使用して同じ効果を達成することを検討します。

#To keep the keys ordered
setup = OrderedDict([('A', 2), ('B', 1), ('C', 3)]) 

def process():
    global setup
    while True:
        for key in setup.iterkeys():
            for value in xrange(setup[key]):
                yield key

これ以上のpythonistaの方法は考えられません。

于 2013-09-07T02:16:42.943 に答える
3
import itertools

SETUP = {'A': 2, 'B': 1, 'C': 3}

def _build_cycle(setup):
    once = itertools.chain.from_iterable(itertools.repeat(k, setup[k]) for k in setup)
    return itertools.cycle(once)

def _iterator_to_rotating_function(it):
    return lambda : next(it)

process = _iterator_to_rotating_function(_build_cycle(SETUP))

データ ソースはディクショナリであるため、順序は定義されていません。

于 2013-09-07T02:29:07.997 に答える
1

追跡するには、渡すグローバル変数またはインデックスが必要です。これが私が思いついたものです。グローバルスコープに変数インデックスを追加したことに注意してください。

index= -1
def process():
   setupList = []
   for key in setup:
       for val in range(setup[key]):
           setupList.append(key)
   setupList.sort()
   global index
   index += 1
   return setupList[index%len(setupList)]
于 2013-09-07T02:15:14.487 に答える