计算项目在OrderedDict

时间:2015-12-10 21:11:12

标签: python dictionary

我已经制作了一系列功能,可以根据平均表现和标准偏差随机生成数十人。 我编写了一行代码,它从前面的函数中获取输出,并按照分数的顺序输出人员的姓名:

sortedlistofnames = [(value) for index, value in enumerate(odsailorscores)]

odsailorsscores是包含人名和已订购分数的输出。

输出如下:

['Bob', 'Alice', 'Clare', 'Dennis', 'Eva']

我需要做的是重复这6次并且对于每组随机值而不是仅仅输出名称列表6次我需要将列表中的每个位置编号并添加到另一个字典中。

例如,条目最终会如此:

[('Alice', [3, 2, 2, 2, 1, 2]), ('Eva', [4, 4, 5, 4, 5, 5]), ('Clare', [1, 5, 3, 3, 3, 1]), ('Dennis', [5, 3, 4, 5, 4, 4]), ('Bob', [2, 1, 1, 1, 2, 3])] 

然后将其放回我之前的一个功能中,最终只是一个有序名称列表,具体取决于他们在6场比赛中的整体表现。

如果它有助于产生随机分数的功能:

def scoreGen(input_dict):
generatedResults = []
for key in input_dict:
    x, y = input_dict[key]
    random_number = gauss(x, math.sqrt(y))
    generatedResults.append((key, random_number))
generatedResults = OrderedDict(sorted(generatedResults, key=lambda t: t[1], reverse=True))
return generatedResults

,输出如下:

OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])

编辑:

对于我所知道的事情似乎存在一些困惑,因为我写得非常糟糕。

基本上我需要一个可以采用INPUT的函数,它看起来像这样:

OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])

这个输入是来自另一个函数,它带有一个字典,其中包含每个赛车的名称,并且每个都具有它们的平均性能和它们的标准差(这个函数如上所示),这里的输入是一个这样的随机例子使用这些值为每个赛车生成得分。

该函数必须能够运行6次并创建一个如下所示的字典/列表:

[('Alice', [3, 2, 2, 2, 1, 2]), ('Eva', [4, 4, 5, 4, 5, 5]), ('Clare', [1, 5, 3, 3, 3, 1]), ('Dennis', [5, 3, 4, 5, 4, 4]), ('Bob', [2, 1, 1, 1, 2, 3])] 

这样就可以将它输回到一个函数(我已经写过)中,它给出了总体输出:

['Bob', 'Alice', 'Clare', 'Dennis', 'Eva']

根据他们在6场比赛中的得分,这是他们的位置。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你可以从一个字典映射开始,从字典名称映射到运行速度的均值和方差。您想要模拟几个种族的结果,并生成从名称到种族结果列表的字典映射(例如[1,2,1]表示该人在两场比赛中最快,在另一场比赛中第二快)。

构建所需的最终输出字典应该很容易。完全不需要将有序字典转换为其键列表,就像您在第一个代码块中所做的那样。相反,您可以在迭代时直接使用index来自enumerate的{​​{1}}:

result_dict = collections.defaultdict(list)

for _ in range(number_of_races_to_simulate):
    race_result = scoreGen(input_dict)
    for place, racer in enumerate(race_result, start=1):
        result_dict[racer].append(place)

结果看起来很像你想要的输出,只是作为defaultdict而不是2元组的列表(但如果你愿意,你可以通过使用字典' s {{{{{{{ 1}}方法)。

请注意,如果您不需要代码中其他任何地方的模拟竞赛中的运行速度值,您可以让items返回一个简单的有序竞赛列表,而不是更复杂的{ {1}}带有无用的值(上面的代码根本不需要改变):

scoreGen