【问题标题】:Python Data Structure SelectionPython 数据结构选择
【发布时间】:2014-02-23 01:31:38
【问题描述】:

假设我有一份足球运动员名单。目前,我只有四名球员。 [梅西、伊涅斯塔、哈维、内马尔]。稍后将添加更多玩家。我想记录这些足球运动员在比赛过程中相互传球的次数。为了跟踪通行证,我相信我需要一个类似的数据结构

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 和编程新手在这里。在我前进的过程中学习经验。提前感谢您的帮助。

【问题讨论】:

  • 您可以使用集合模块中的 defaultdict。这是处理此任务的最简单方法。 Here 是文档和示例的链接。
  • 这是一个旁注——但如果你想制作一本字典,你想使用{}而不是[](制作一个列表)。所以Messi = [Iniesta: 4, Xavi: 5 , Neymar: 8] 将是Messi = {Iniesta: 4, Xavi: 5 , Neymar: 8},因为Neymar 等是对象。
  • 已修复。谢谢! @追逐

标签: python list data-structures dictionary


【解决方案1】:

这是一个有趣的问题,也许是一个很好的情况,像 graph 这样的东西可能有用。您可以通过简单地使用字典来在 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']

这种类似图形的数据结构的优点在于,您不仅可以保存传球次数,还可以保存每次传球的信息(从梅西到伊涅斯塔)

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

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 实现(这是一个有趣的答案,谢谢!)

【讨论】:

    【解决方案2】:

    我建议你构造一个二维方阵。数组应该有维度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()
    

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 1970-01-01
      • 2015-09-03
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多