Python 计算项目在OrderedICT中某个位置出现的次数

Python 计算项目在OrderedICT中某个位置出现的次数,python,dictionary,Python,Dictionary,我做了一系列函数,根据平均绩效和标准差随机生成人员分数。 我已经编写了一行代码,它从前面的函数中获取输出,并按照分数的顺序输出人员的姓名: sortedlistofnames = [(value) for index, value in enumerate(odsailorscores)] ODS是一种输出,其中包含人员的姓名及其已排序的分数 输出如下所示: ['Bob', 'Alice', 'Clare', 'Dennis', 'Eva'] OrderedDict([('Clare', 1

我做了一系列函数,根据平均绩效和标准差随机生成人员分数。 我已经编写了一行代码,它从前面的函数中获取输出,并按照分数的顺序输出人员的姓名:

sortedlistofnames = [(value) for index, value in enumerate(odsailorscores)]
ODS是一种输出,其中包含人员的姓名及其已排序的分数

输出如下所示:

['Bob', 'Alice', 'Clare', 'Dennis', 'Eva']
OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])
OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])
[('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次,对于每一组输入的随机值,而不是仅仅输出名称列表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
输出如下所示:

['Bob', 'Alice', 'Clare', 'Dennis', 'Eva']
OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])
OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])
[('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']
OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])
OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])
[('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次,并生成如下所示的字典/列表:

['Bob', 'Alice', 'Clare', 'Dennis', 'Eva']
OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])
OrderedDict([('Clare', 103.77155669358106), ('Bob', 100.7887661842925), ('Alice', 100.0), ('Eva', 91.8316903347015), ('Dennis', 90.0)])
[('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,2,1]
表示该人在两场比赛中跑得最快,在另一场比赛中排名第二)

构建您想要的最终输出字典应该很容易。完全没有必要像您在第一个代码块中所做的那样,将有序字典转换为键列表。相反,您可以在迭代时直接使用从
enumerate
获得的
索引:

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元组列表(但是如果您愿意,可以使用字典的
items
方法获得元组)

请注意,如果您不需要在代码中的任何其他地方输入模拟比赛的跑步速度值,您可以让
scoreGen
返回一个简单的有序车手列表,而不是一个更复杂的
OrderedDict
及其无用值(上面的代码根本不需要更改):


你能添加一些输入和期望的输出吗?因为我不知道你实际上想要计算什么。为什么你要在
sortedlistofnames=[(value)表示索引,在enumerate(odsealScores)]
语句中使用
enumerate()
index
sortedlistofnames=list(OdsalerScores)
将给出相同的结果。你的问题的标题与其中的信息有什么关系?我已经用更多的信息和细节更新了这个问题。另外,不使用enumerate()的解决方案非常有用,我不知道它会这么简单。谢谢。您是如何从问题中“理解”所有这些的?您显示的第一段代码不总是打印最后的值吗?我需要能够显示每个参赛者在每次比赛后的排名,并将其记录在列表中,同时能够根据任何数量的比赛后的总分显示参赛者的总体顺序。如果我在问题中没有说清楚,我很抱歉。@Green:我不确定我是否理解你在评论中提出的问题。第一段代码不打印任何内容,而是构建一个字典。如果您需要按照参赛者在每场比赛中的排列顺序列出姓名,请调用scoreGen返回的词典中的
list
,以获取其密钥列表(或者像我在第二个代码块中那样修改函数,直接返回列表)。@Blckknght抱歉,我的意思是,它构建的列表似乎只是在循环的最后一次构建列表时每个人的位置。另外,我需要一份他们来过的地方的名字列表,我的意思是以列表的形式,比如(['Alice',[1,2,1,1,3,1],'Bob][…..例如,最终输出确实需要能够根据所有比赛的总数简单地按顺序显示姓名,但必须以这样的方式完成,即如果需要,您可以找到每个比赛的位置。听起来您运行的内容与我在答案中输入的内容不同。我的代码将返回一个字典,其中s键是赛车手的名字,谁的值是列表,其中应该有
number\u of \u races\u以模拟
值。如果您得到了其他内容,则可能是我的代码中存在错误(并非不可能,但您需要提供更多详细信息)或者你错误地将我的代码翻译到了你自己的系统中。我无法帮助你处理后者,因为我不知道你实际运行的是什么代码!