Python数据结构选择

2024-05-17 10:10:55 发布

您现在位置: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的字典。这就是我如何得到下面的线。在

^{pr2}$

有人建议我试试这样的东西

my_dynamic_vars = dict()
string = 'someString'

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

Python和编程新手。边学习边体验。提前谢谢你的帮助。在


Tags: 数据结构string字典my玩家dynamicvarsdict
1条回答
网友
1楼 · 发布于 2024-05-17 10:10:55

我建议你建立一个二维的方阵。数组的维数应该是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()
网友
2楼 · 发布于 2024-05-17 10:10:55

这是一个有趣的问题,也许是一个很好的情况,在这种情况下,可能会有用。您可以在python中实现一个图,只需使用一个字典,字典的键是球员的名字,其值是列出已经传球的球员。在

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

要获得任何一个玩家的传球次数:

^{pr2}$

向特定玩家添加新传球:

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

数一数梅西传给哈维的次数

^{4}$

要增加一个新球员,只要在他第一次传球时就加上他

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

现在,他也准备好有更多的传球给他

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

这种类似图表的数据结构的优点在于,你不仅保留了传球的次数,而且还保存了每一次传球的信息(从梅西到伊涅斯塔)

这里是一些捕捉这种行为的函数的超级简单的实现(我认为初学者应该能够掌握这些东西,如果下面的内容有点太混乱,请告诉我)

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')

希望您觉得这很有帮助;下面是关于the python docs中的图的python实现的更多信息(这是一个有趣的回答,谢谢!)在

相关问题 更多 >