2013-10-17 114 views
1

我有一個包含多個人的ID的字典和一個整數值(贏得總)是這樣的:追加值字典基於鍵

{12345: 2, 23456: 10} 

只有2人在它目前的測試,但有會很多。

我有一個像這樣在不同的整數值(總場)的格式相同的另一個解釋:

{12345: 10, 23456: 20} 

我需要創建第三個字典,商店贏得像這樣的(採取從第一個字典值百分比和第二詞典分):

{12345: .200, 23456: .500} *保持原始比例

- 或 -

{12345: 20, 23456: 50} *乘以100得到整數值(如果這只是我能做到的)

這需要爲字典中的所有玩家完成。每個人在每本詞典中應該有一對匹配。

有人可以幫忙嗎?我已經搜索了這些論壇幾天,找不到一個好的方法來做到這一點。

+3

我承認我很擔心一點,你要存儲這些值獨立的詞典,然後再分開。據推測,如果有人贏得*總數*,他必須有*總比賽*。您應該將它們全部存儲在相同的數據結構中,以便每個播放器都沒有兩個(或三個)密鑰查找。我會創建一個'Player'類,但是如果OOP不符合你的喜好,也許只是['namedtuple('wins','games')']的一個字典(http://docs.python.org/2/庫/ collections.html#collections.namedtuple)。 – kojiro

回答

1

爲什麼不計算每個人在飛行中的勝率?與保留第三個字典相比,它會更容易和更有效(並且符合良好的數據存儲原則)。

喜歡的東西:

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 
1

這個怎麼樣:

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

其中winsgames - 源字典。這將僅爲兩個字典中顯示的鍵創建結果值。

+0

除非將分子或分母轉換爲float(),否則這將爲每個人返回零。 –

+0

@ChristianTernus不,這顯然是Python3,所以它會隱式轉換爲浮動。在Python2中,你可以從'__future__ import division'中。見[PEP-238](http://www.python.org/dev/peps/pep-0238/) – kojiro

+0

@kojiro這很棒!我的工具箱中的另一個工具 - 謝謝。 –

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 
+0

您可以使用['defaultdict'](http://docs.python.org/2/library/collections.html#collections.defaultdict)或'percentage.setdefault(key,0)'節省一些時間,而不是'KeyError'檢查。 – kojiro

+1

@kojiro:在這個答案中顯示的「容易請求寬恕然後權限」的樣式在某些情況下可能會更快(儘管我認爲不是這個,因爲您沒有對現有百分比進行任何更新)。 Python異常的速度比其他控制結構慢不了幾個數量級(比如某些其他語言的異常),所以使用它們來處理罕見但並非真正的「特殊」情況是完全正確的。哎呀,執行每個'for'循環都需要拋出'StopIteration'異常來標記它的結束! – Blckknght

+0

@Blckknght除了如果你使用異常作爲信號,有時你會不小心隱藏真實的錯誤,就像這裏的情況一樣。你顯然從來沒有這樣的情況,即「勝利」存在一個關鍵字,但「遊戲」不存在。 (你如何贏得一場你從未打過的比賽?) – kojiro