首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python数据结构选择

Python数据结构选择
EN

Stack Overflow用户
提问于 2014-02-23 01:31:38
回答 2查看 180关注 0票数 0

假设我有一份足球运动员的名单。现在,我只有四个球员。梅西,伊涅斯塔,哈维,内马尔更多的球员将在稍后添加。我想知道这些足球运动员在比赛过程中互相传递的次数。为了跟踪传球情况,我相信我需要一个类似于此的数据结构

代码语言:javascript
运行
复制
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的字典。这就是我如何得到下面的线。

代码语言:javascript
运行
复制
Messi = [Iniesta: 4, Xavi: 5 , Neymar: 8]

有人建议我试试这样的方法

代码语言:javascript
运行
复制
my_dynamic_vars = dict()
string = 'someString'

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

这里的Python和编程新手。边走边用经验学习。提前感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-23 02:07:16

这是一个有趣的问题,也可能是一个很好的情况,比如可能很有用。您可以在python中实现一个图形,只需使用一个字典,它的键是玩家的名字,其值是已通过球的球员列表。

代码语言:javascript
运行
复制
passes = {
    'Messi' : ['Iniesta', 'Xavi','Neymar', 'Xavi', 'Xavi'],
    'Iniesta' : ['Messi','Xavi', 'Neymar','Messi', 'Xavi'],
    'Xavi'  : ['Messi','Neymar','Messi','Neymar'],
    'Neymar' : ['Iniesta', 'Xavi','Iniesta', 'Xavi'],
}

若要获得任何一位球员的传球次数:

代码语言:javascript
运行
复制
len(passes['Messi'])

若要向特定球员添加新传球:

代码语言:javascript
运行
复制
passes['Messi'].append('Xavi')

计算梅西传递给哈维的次数

代码语言:javascript
运行
复制
passes['Messi'].count('Xavi')

要增加一个新的球员,只需在他第一次传球的时候加入他。

代码语言:javascript
运行
复制
passes['Pele'] = ['Messi']

现在,他也准备把更多的传球“附加”给他

代码语言:javascript
运行
复制
passes['Pele'].append['Xavi']

这种类似图的数据结构的好处在于,您不仅保存了通行证的数量,而且保存了每一次传递的信息(从Messi到Iniesta)。

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

代码语言:javascript
运行
复制
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保存在可以持续更新的某些数据库中,但即使没有数据库,也可以添加以下代码并运行它以获得这样的想法:

代码语言:javascript
运行
复制
# 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实现的更多信息(这是一个有趣的答案,谢谢!)

票数 2
EN

Stack Overflow用户

发布于 2014-02-23 01:50:00

我建议你构造一个二维的方阵。数组应该具有维度N x N。每个索引代表一个玩家。因此,passes[i][j]的值是player i传递给player j的次数。值passes[i][i]总是为零,因为玩家不能传递给自己

下面是一个例子。

代码语言:javascript
运行
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21963019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档