2014-02-23 95 views
0

比方說,我有一個足球運動員名單。目前,我只有四名球員。 [梅西,伊涅斯塔,哈維,內馬爾]。稍後會增加更多玩家。我想跟蹤這些足球運動員在比賽過程中相互傳球的次數。爲了保持傳球的軌跡,我相信我會需要類似這樣的Python數據結構選擇

Messi = {Iniesta: 4, Xavi: 5 , Neymar: 8} 
Iniesta = {Messi: 4, Xavi: 10 , Neymar: 5} 
Xavi = {Messi: 5, Iniesta: 10 , Neymar: 6} 
Neymar = {Messi: 8, Iniesta: 5 , Xavi: 6} 

我是否有權使用字典的數據結構?如果不是,哪種數據結構更適合?如果是的話,我怎麼用字典來解決這個問題呢?我如何解決不時包含的新玩家問題,併爲他們創建一本字典。 作爲一個例子,如果我得到列表中的第一個元素,第一次迭代中的List(i)是Messi,我如何使用存儲在它中的值創建一個名稱爲Messi的字典。那是我如何得到下面的行。

Messi = [Iniesta: 4, Xavi: 5 , Neymar: 8] 

有人建議我嘗試這樣的事情

my_dynamic_vars = dict() 
string = 'someString' 

my_dynamic_vars.update({string: dict()}) 

Python和編程新手在這裏。隨着經驗學習。預先感謝您的幫助。

+0

你可以使用defaultdict from collections模塊。這是處理這個任務的最簡單的方法。 [Here](http://docs.python.org/2/library/collections.html#collections.defaultdict)是文檔和示例的鏈接。 – Shahram

+0

這是一個側面提示 - 但是如果你想創建一個字典,你想使用'{}'而不是'[]'(生成一個列表)。因此,'梅西= [伊涅斯塔:4,哈維:5,內馬爾:8]'將會是'梅西= {伊涅斯塔:4,哈維:5,內馬爾:8}',因爲'Neymar'等是物體。 – chase

+0

修正了它。謝謝! @追 – user3078335

回答

2

這是一個有趣的問題,也許是一個不錯的情況有點像可能是有用的。你可以通過簡單地使用一個字典來實現一個圖表,這個字典的鍵是玩家的名字,其值是列出已經傳遞球的玩家。

passes = { 
    'Messi' : ['Iniesta', 'Xavi','Neymar', 'Xavi', 'Xavi'], 
    'Iniesta' : ['Messi','Xavi', 'Neymar','Messi', 'Xavi'], 
    'Xavi' : ['Messi','Neymar','Messi','Neymar'], 
    'Neymar' : ['Iniesta', 'Xavi','Iniesta', 'Xavi'], 
} 

爲了任何一個球員得到傳球次數:

len(passes['Messi']) 

要一個新的過程添加到一個特定的玩家:

passes['Messi'].append('Xavi') 

要計算梅西傳遞的次數到哈維

passes['Messi'].count('Xavi') 

要添加一個新的球員,只是加了他,他第一次做了一通現在

passes['Pele'] = ['Messi'] 

,他還準備有更多的通行證「附加」他

passes['Pele'].append['Xavi'] 

什麼這個圖是偉大的類數據結構是,您不僅可以保留通行證的數量,而且還可以保存每個通行證的信息(從Messi到Iniesta)

這裏是一些超級基礎實施的一些功能,它捕獲這種行爲(我認爲初學者應該能夠掌握這個東西,讓我知道,如果跌破什麼是有點太混亂了)

passes = {} 

def new_pass(player1, player2): 
    # if p1 has no passes, create a new entry in the dict, else append to existing 
    if player1 not in passes: 
     passes[player1] = [player2] 
    else: 
     passes[player1].append(player2) 

def total_passes(player1): 
    # if p1 has any passes, return the total number; otherewise return 0 
    total = len(passes[player1]) if player1 in passes else 0 
    return total 

def total_passes_from_p1_to_p2(player1, player2): 
    # if p1 has any passes, count number of passes to player 2; otherwise return 0 
    total = passes[player1].count(player2) if player1 in passes else 0 
    return total 

理想情況下,你會在一些數據庫,你可以不斷更新來節省passes,但即使沒有數據庫,你可以添加以下代碼並運行它以得到這樣的想法:

# add some new passes! 
new_pass('Messi', 'Xavi') 
new_pass('Xavi', 'Iniesta') 
new_pass('Iniesta', 'Messi') 
new_pass('Messi', 'Iniesta') 
new_pass('Iniesta', 'Messi') 

# let's see where we currently stand 
print total_passes('Messi') 
print total_passes('Iniesta') 
print total_passes_from_p1_to_p2('Messi', 'Xavi') 

希望你覺得這有幫助;這裏有更多關於python實現的圖表,從the python docs(這是一個有趣的答案寫出來,謝謝!)

1

我建議你構造一個二維平方陣列。該陣列的尺寸應爲N x N。每個索引代表一個玩家。所以passes[i][j]的值是玩家i傳遞給玩家j的次數。價值passes[i][i]始終爲零,因爲玩家不能傳遞給自己

下面是一個示例。

players = ['Charles','Meow','Rebecca'] 

players = dict(zip(players,range(len(players)))) 
rplayers = dict(zip(range(len(players)),players.keys())) 

passes = [] 
for i in range(len(players)): 
    passes.append([ 0 for i in range(len(players))]) 

def pass_to(f,t): 
    passes[players[f]][players[t]] += 1 

pass_to('Charles','Rebecca') 
pass_to('Rebecca','Meow') 
pass_to('Charles','Rebecca') 

def showPasses(): 
    for i in range(len(players)): 
     for j in range(len(players)): 
      print("%s passed to %s %d times" % (rplayers[i],rplayers[j],passes[i][j],)) 

showPasses()