2014-02-23 96 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()