假设我有足球运动员名单。现在,我只有四名球员。 [梅西,伊涅斯塔,哈维,内马尔]。稍后会添加更多玩家。我想跟踪这些足球运动员在比赛过程中互相传递的次数。为了跟踪传球,我相信我需要一个与此类似的数据结构
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 :(得分:2)
这是一个有趣的问题,也许是一个很好的情况,像图这样的东西可能会有用。您可以通过简单地使用一个字典来实现python中的图形,该字典的键是玩家的名字,其值是列出已经传球的玩家。
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 :(得分: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()