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 回答
2

尽管我的评论有点刻薄,但迭代器确实是这里的方法:

from itertools import cycle, chain, repeat
def process(setup):
    # to use a dictionary, just change the end to in setup.items()
    return cycle(chain.from_iterable(repeat(c, n) for c, n in setup))

# A namedtuple would also be appropriate here
setup = [('A', 2), ('B', 1), ('C', 3)]

it = process(setup) # global variables are of the devil
print next(it) # repeat ad nauseam

one-liner 的工作方式是:

  1. 生成器表达式repeat(c, n)为您提供产生序列的迭代器['A', 'A']['B']并且['C', 'C', 'C']
  2. chain.from_iterable()加入他们['A', 'A', 'B', 'C', 'C', 'C']
  3. cycle()使最后一个序列无休止地重复
  4. 连续调用next()将从那个无休止的序列中返回值。
于 2013-09-07T02:33:28.567 回答
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 回答