Python 基于键将值追加到字典

Python 基于键将值追加到字典,python,dictionary,Python,Dictionary,我有一本字典,其中包含多个人的ID和一个整数值(win total),如下所示: {12345: 2, 23456: 10} {12345: 10, 23456: 20} 目前只有2个人在里面进行测试,但是会有很多人 我有另一个相同格式的字典,具有不同的整数值(总游戏数),如下所示: {12345: 2, 23456: 10} {12345: 10, 23456: 20} 我需要创建第三个字典,它存储如下所示的赢百分比(从第一个字典中获取值并除以第二个字典): {12345.200234

我有一本字典,其中包含多个人的ID和一个整数值(win total),如下所示:

{12345: 2, 23456: 10}
{12345: 10, 23456: 20}
目前只有2个人在里面进行测试,但是会有很多人

我有另一个相同格式的字典,具有不同的整数值(总游戏数),如下所示:

{12345: 2, 23456: 10}
{12345: 10, 23456: 20}
我需要创建第三个字典,它存储如下所示的赢百分比(从第一个字典中获取值并除以第二个字典):

{12345.20023456.500}
*保持原始百分比

-或-

{12345:2023456:50}
*乘以100得到整数值(如果这是唯一的方法)

这需要为字典中的所有玩家完成。每个人的字典里都应该有一对匹配的词


有人能帮忙吗?我已经搜索了这些论坛好几天了,但找不到一个好方法。为什么不计算每个人在飞行中的获胜百分比呢?这比保存第三本词典更容易、更有效(并且符合良好的数据存储原则)

比如:

def win_percentage(id):
    if id in total_games and id in num_wins and total_games[id] > 0:
        return num_wins[id] / float(total_games[id])
    else:
        return 0 # or raise an exception, whatever
那么这个呢:

{ key: wins[key]/games[key] for key in wins.keys()
                            if key in games and games[key]>0
}

其中
获胜
游戏
——您的源词典。这将仅为两个字典中显示的键创建结果值。

以下内容将创建一个包含百分比的新字典

游戏总数为零或某个人的条目缺少游戏字典的情况通过将百分比设置为0来处理

wins={12345: 2, 23456: 10}
games={12345: 10, 23456: 20}

percentage={}
for key, value in wins.iteritems():
    try :
       percentage[key]=wins[key]*1.0/games[key]*1.0
    except KeyError :
       percentage[key]=0
    except ZeroDivisionError :
       percentage[key]=0

除非将分子或分母转换为
float()
@ChristianTernus,否则每个人都将返回零。不,这显然是Python3,因此它将隐式转换为float。在Python2中,您可以从未来导入分部
。看@kojiro,太棒了!我工具箱里的另一个工具——谢谢。是的,我有一个Python3。我刚刚添加了额外的零分母检查,以防万一:)@kojiro什么能清楚地表明这是Python3?2不支持dict理解吗?我承认这让我有点担心,你将这些值存储在独立的dict中,然后再将它们分开。大概如果有人赢得了总冠军,那么他也必须赢得总冠军。您应该将它们都存储在相同的数据结构中,这样就不会为每个播放器查找两个(或三个)键。我会创建一个
Player
类,但如果OOP不符合您的喜好,也许只是一个命令。您可以使用或
百分比.setdefault(key,0)
来节省一些时间,而不是
KeyError
检查。@kojiro:在某些情况下,这个答案中显示的“请求原谅比获得许可更容易”的样式可能更快(虽然我不认为是这一个,因为您没有对现有百分比进行任何更新)。Python异常并不比其他控制结构慢几个数量级(就像其他一些语言中的异常),因此使用它们来处理不常见但不是真正的“异常”是完全正确的情况。见鬼,每个
for
循环的实现都需要抛出一个
StopIteration
异常来标记它的结束!@Blckknght除了如果你使用异常作为信号,有时你会意外地隐藏真正的错误,就像这里的情况一样。显然,你永远不会有一个
wins
的键存在但不存在的情况对于
游戏
(你怎么能赢得你从未玩过的游戏?)