每个设定量执行除法作为变量增长 - python

时间:2018-05-07 18:19:48

标签: python

如果我有以下序列从for循环迭代(并且此序列每次都不同),

freq = 10

for var in table:

    sequence = (size * var) + sequence
    size = max(size, round(sequence/freq))
    # Output = 20000 30000 40000 35000 50000 60000 70000 49000 80000

当序列达到40,000时,频率变为5 当序列命中60,000时,freq变为2.5 当序列达到80,000时,频率变为1.25

问题是,当序列大于20000时,我不能简单地将频率的一半,因为它将持续一半,我可以为每个条件写出数百个if;但我觉得必须有更有效的解决方案。

2 个答案:

答案 0 :(得分:1)

您可以跟踪上次将频率减半的记录

freq = 10
next_seq = 40000

for var in table:

    sequence += (size * var)
    size = max(size, round(sequence/freq))
    while sequence >= next_seq:
        next_seq += 20000
        freq /= 2

在这种情况下,freq将等于10,直到序列等于40000,然后是5,直到序列等于60000等...

编辑:我已将if更改为while,以防您的序列在一次迭代中增加超过20000次。

答案 1 :(得分:0)

您可以为每var计算一次(这可能需要也可能不需要):

这带来了额外的潜在好处,即允许不严格上升的序列。

freq = 10

for var in table:

    sequence = (size * var) + sequence
    if sequence < 20000:
        divisor = freq
    else:
        divisor = freq / (2.0 ** (sequence//20000 - 1))
    size = max(size, round(sequence/divisor))
    # Output = 20000 30000 40000 35000 50000 60000 70000 49000 80000

这使得它从40k开始每20k递增一次:

>>> freq = 10
... for num in [0, 19999, 20000, 39999, 40000, 59999, 60000, 79999, 80000]:
...     print (freq / (2.0 ** (num//20000) - 1) if num >= 20000 else freq)
10    # 0
10    # 19999
10    # 20000
10    # 39999
5.0   # 40000
5.0   # 59999
2.5   # 60000
2.5   # 79999
1.25  # 80000

注意:这依赖于整数除法来减半。在Py3中//除法是必要的,以实现这一结果。在Py2.7上,它相当于/