我有一个元组列表:
[('Player1', 'A', 1, 100),
('Player1', 'B', 15, 100),
('Player2', 'A', 7, 100),
('Player2', 'B', 65, 100),
('Global Total', None, 88, 100)]
我希望将其转换为以下格式的dict:
{
'Player1': {
'A': [1, 12.5],
'B': [15, 18.75],
'Total': [16, 18.18]
},
'Player2': {
'A': [7, 87.5],
'B': [65, 81.25],
'Total': [72, 81.81]
},
'Global Total': {
'A': [8, 100],
'B': [80, 100]
}
}
所以每个玩家都有它的本地总价值和它的百分比,根据它的全局总价值。你知道吗
目前,我是这样做的:
fixed_vals = {}
for name, status, qtd, prct in data_set: # This is the list of tuples var
if name in fixed_vals:
fixed_vals[name].update({status: [qtd, prct]})
else:
fixed_vals[name] = {status: [qtd, prct]}
fixed_vals['Global Total']['Total'] = fixed_vals['Global Total'].pop(None)
total_a = 0
for k, v in fixed_vals.items():
if k != 'Global Total':
total_a += v['A'][0]
fixed_vals['Global Total']['A'] = [
total_a, total_a * 100 / fixed_vals['Global Total']['Total'][0]
]
fixed_vals['Global Total']['B'] = [
fixed_vals['Global Total']['Total'][0] - total_a,
fixed_vals['Global Total']['Total'][0] - fixed_vals['Global Total']['A'][1]
]
for player, vals in fixed_vals.items():
if player != 'Global Total':
vals['A'][1] = vals['A'][0] * 100 / fixed_vals['Global Total']['A'][0]
vals['B'][1] = fixed_vals['Global Total']['A'][1] - vals['B'][1]
问题是这不是很灵活,因为我必须做类似的事情, 但几乎有12个类别(A,B,…)
有没有更好的办法?也许这对熊猫来说是微不足道的?你知道吗
编辑澄清:
每个玩家没有重复的类别,每个人都有相同的序列(有些可能有0,但类别是唯一的)
每个人似乎都被dict唯一的解决方案所吸引,但是为什么不尝试转换成
pandas
?你知道吗基本上,您所需要的只是“df”数据帧,其余的都可以 计算和添加以后,不需要保存到字典。你知道吗
以下内容应OP请求更新:
一种解决方案是使用groupby对来自同一玩家的连续玩家分数进行分组
然后导入我们的groupby
那就去更新所有的总数
注意此解决方案!要求!所有player1的分数在元组中分组,所有player2的分数在元组中分组等
A)将代码分解为可管理的块:
现在我们有了一个玩家计数的dict,但是唯一有效的百分比是total,我们没有全局计数。你知道吗
build_global(result)
现在为每个事件生成有效的全局计数。你知道吗最后:
calc_percent(result)
遍历并构建百分比。你知道吗结果是:
如果您确实需要它,您可以删除global total中的
None
条目,并dict(result)
将defaultdict
转换为香草dict
。你知道吗相关问题 更多 >
编程相关推荐