Python Trueskill - 使用字典
我正在尝试使用Python的Trueskill包,并且已经掌握了一些基本知识。
对于两个玩家的对战,我可以这样做:
alice = Rating()
bob = Rating()
alice, bob = rate_1vs1(alice, bob)
而对于多个玩家的对战,我可以这样做:
alice = Rating()
bob = Rating()
eve = Rating()
alice, bob, eve = rate([(alice,),(bob,),(eve,)], ranks=[0, 1, 2])
我目前有一个数据库,结构如下,我想在这个基础上进行评分...
game participant rank ....(various game stats)
1 alice 2
1 bob 1
1 eve 3
2 alice 1
2 eve 1
3 bob 1
3 carol 2
3 alice 3
3 ted 4
3 eve 5
.......
这是一个简化版,因为有些游戏只有2个参与者,有些则多达20个。我想做的是逐个游戏地读取数据库,读取参与者的信息,并根据结果进行更新。我不太确定最好的做法是什么,因为我知道动态创建变量是不推荐的,但正确的方法是什么呢?
-- 编辑,使用字典 --
所以使用字典我可以这样做:
ratings = {}
k = 0
for participant in results:
ratings[k] = Rating
k += 1
但是我不知道怎么给玩家评分,因为下面的做法不行,因为字典会被当作一个评分组,而不是单独的参与者。
new_ratings = rate(ratings.values(),ranks=[0-k])
1 个回答
1
我之前做过类似的事情,申请参加一个电视节目:https://gist.github.com/sublee/4967876
defaultdict
和 groupby
可能会帮助你实现你想要的效果:
from collections import defaultdict
from itertools import groupby
from pprint import pprint
from trueskill import Rating, rate
results = [(1, 'alice', 2),
(1, 'bob', 1),
(1, 'eve', 3),
(2, 'alice', 1),
(2, 'eve', 1),
(3, 'bob', 1),
(3, 'carol', 2),
(3, 'alice', 3),
(3, 'ted', 4),
(3, 'eve', 5)]
ratings = defaultdict(Rating)
for game_id, result in groupby(results, lambda x: x[0]):
result = list(result)
rating_groups = [(ratings[name],) for game_id, name, rank in result]
ranks = [rank for game_id, name, rank in result]
transformed_groups = rate(rating_groups, ranks=ranks)
for x, (game_id, name, rank) in enumerate(result):
ratings[name], = transformed_groups[x]
pprint(dict(ratings))
我得到的结果是:
{'alice': trueskill.Rating(mu=23.967, sigma=4.088),
'bob': trueskill.Rating(mu=36.119, sigma=5.434),
'carol': trueskill.Rating(mu=29.226, sigma=5.342),
'eve': trueskill.Rating(mu=16.740, sigma=4.438),
'ted': trueskill.Rating(mu=21.013, sigma=5.150)}