Python 用于循环计算的字典

Python dictionary for loop calculation

我需要在创建字典的地方创建代码,我需要为每个键设置值。我可以手动完成,但需要创建一个循环来完成它,以缩短代码。计算过程如下:

Rank 1 = 2500
Rank 2 = Rank 1 +  7500 (2500 + 5000 ) = 10 000
Rank 3 = Rank 2 + 12500 (7500 + 5000) = 22 500
Rank 4 = Rank 3 + 17500 (12500 + 5000) = 40 000

字典应如下所示:

rank 0 = 0
rank 1 = 2500
rank 2 = 10000
rank 3 = 22500
rank 4 = 40000
rank 5 = 62500
rank 6 = 90000

我要循环的代码:

def affinity(xp):
           return xp + 5000


    rank_dict = {}
    for number in range(0, 31):
    rank_dict["rank %s" % number] = 0
    rank_dict["rank 1"] = rank_dict.get("rank 0") + 2500
    rank_dict["rank 2"] = rank_dict.get("rank 1") + affinity(2500)
    rank_dict["rank 3"] = rank_dict.get("rank 2") + affinity(7500)
    rank_dict["rank 4"] = rank_dict.get("rank 3") + affinity(12500)
    rank_dict["rank 5"] = rank_dict.get("rank 4") + affinity(17500)
    rank_dict["rank 6"] = rank_dict.get("rank 5") + affinity(22500)
    rank_dict["rank 7"] = rank_dict.get("rank 6") + affinity(27500)
    rank_dict["rank 8"] = rank_dict.get("rank 7") + affinity(32500)
    rank_dict["rank 9"] = rank_dict.get("rank 8") + affinity(37500)
    rank_dict["rank 10"] = rank_dict.get("rank 9") + affinity(42500)
    rank_dict["rank 11"] = rank_dict.get("rank 10") + affinity(47500)
    rank_dict["rank 12"] = rank_dict.get("rank 11") + affinity(52500)
    rank_dict["rank 13"] = rank_dict.get("rank 12") + affinity(57500)
    rank_dict["rank 14"] = rank_dict.get("rank 13") + affinity(62500)
    rank_dict["rank 15"] = rank_dict.get("rank 14") + affinity(67500)
    rank_dict["rank 16"] = rank_dict.get("rank 15") + affinity(72500)
    rank_dict["rank 17"] = rank_dict.get("rank 16") + affinity(77500)
    rank_dict["rank 18"] = rank_dict.get("rank 17") + affinity(82500)
    rank_dict["rank 19"] = rank_dict.get("rank 18") + affinity(87500)
    rank_dict["rank 20"] = rank_dict.get("rank 19") + affinity(92500)
    rank_dict["rank 21"] = rank_dict.get("rank 20") + affinity(97500)
    rank_dict["rank 22"] = rank_dict.get("rank 21") + affinity(102500)
    rank_dict["rank 23"] = rank_dict.get("rank 22") + affinity(107500)
    rank_dict["rank 24"] = rank_dict.get("rank 23") + affinity(112500)
    rank_dict["rank 25"] = rank_dict.get("rank 24") + affinity(117500)
    rank_dict["rank 26"] = rank_dict.get("rank 25") + affinity(122500)
    rank_dict["rank 27"] = rank_dict.get("rank 26") + affinity(127500)
    rank_dict["rank 28"] = rank_dict.get("rank 27") + affinity(132500)
    rank_dict["rank 29"] = rank_dict.get("rank 28") + affinity(137500)
    rank_dict["rank 30"] = rank_dict.get("rank 29") + affinity(142500)
print(rank_dict)

试过这个,但没有正确循环:

def affinity(xp):
         return xp + 5000


    rank_dict = {'rank 0': 0, 'rank 1': 2500}
    for number in range(2, 31):
        rank_dict["rank %s" % number] = 2500
    for number in range(2, 31):
        rank_dict["rank %s" % number] = rank_dict.get("rank %s" % number) + affinity(5000)
    print(rank_dict)

这里主要是对下一项的判定公式进行简化——模式是每次与前一等级的增量增加5000。

应该这样做:

rank_dict = {"rank 1": 2500}
inc = 2500
for rank in range(2, 31):
    inc += 5000
    rank_dict[f"rank {rank}"] = rank_dict[f"rank {rank-1}"] + inc
print(rank_dict)

或者随意使用 ziprange 来避免手动递增计数器:

rank_dict = {}
for rank, prev, inc in zip(
    range(1, 31),
    range(0, 30),
    range(2500, 2500 + 30 * 5000, 5000)
):
    rank_dict[f"rank {rank}"] = rank_dict.get(f"rank {prev}", 0) + inc
print(rank_dict)

这是一个不错的方法。

import numpy as np

incs = [2500] + [5000] * 5
vals = np.cumsum(np.cumsum(incs))
rank_dict = {f'rank {i}':v for i,v in enumerate(vals,1)}

生成的字典:

{'rank 1': 2500,
 'rank 2': 10000,
 'rank 3': 22500,
 'rank 4': 40000,
 'rank 5': 62500,
 'rank 6': 90000}

也许你可以证明你错在哪里? 我能看到的是,当你添加一个新的字典条目时,你总是在第一个循环“2500”中添加值 第二个循环只添加了 5000 (xp)+ 5000 added in the function,所以你所有的字典条目都可能添加为 12500.

我相信你需要的是:

var = 2500
for number in range(2, 31):
        var+= 5000
        rank_dict["rank %s" % number] = var

有很多方法可以做到这一点。这是一个:

rank_dict = dict()
val = 0
for i in range(31):
    rank_dict[f'rank {i}'] = val
    val += 2_500 if i == 0 else 5_000

print(rank_dict)

...或Python 3.10 版本:

rank_dict = dict()
for i in range(31):
    match i:
        case 0:
            val = 0
        case 1:
            val = 2_500
        case _:
            val += 5_000
    rank_dict[f'rank {i}'] = val