深度嵌套字典/映射情况所需的替代数据结构



数据的一些背景:一些不同的游戏正在玩,每个游戏都有许多玩家。每个游戏由多个回合组成,在每个回合中,每个参与的玩家都会采取行动。我在这里要做的是在内存中构建一个数据结构,用于存储玩家在所有正在玩的游戏中采取的个人操作的完整历史记录。

一个明显的结构是深度嵌套的字典/哈希图,其中每个game_id映射到多个player_id,每个player_id映射到不同的round_number,每个round_number映射到一个action

换句话说,game_id:player_id:round_number:action.另一方面,我也可以使用game_id:round_number:player_id:action

当我尝试出于不同的分析目的访问上面的数据结构时,就会出现问题。例如,如果我想知道玩家在给定游戏的特定回合中所做的所有动作,那么game_id:player_id:round_number:action是不方便的。相反,如果我想知道特定玩家在给定游戏过程中所做的所有动作,那么拥有game_id:round_number:player_id:action同样不方便。不幸的是,就我而言,我需要经常问这两个问题。

我想知道是否有一种单一的数据结构可以存储此类数据,并且可以方便地访问上述玩家级别和回合级别的数据。如果这很重要,实现将在Python中。

编辑:有些人推荐内存sqlite数据库来处理这样的关系查询。但是,它的性能对我来说可能是一个问题,正如这里所讨论的: SQLite 性能基准 -- 为什么 :memory: 这么慢...只有磁盘快 1.5 倍?

一种方法是将数据存储在字典中,但维护索引以允许快速访问数据的各种视图。 你可以用一个类来构建它,或者只是函数。 这是它的jist(未经测试):

from collections import defaultdict
game_dict = {}  # keyed by (game, player, round) tuple
game_player_ix = defaultdict(list)
game_round_ix = defaultdict(list)
def add_action(game, player, round):
    game_dict[(game, round, player)] = action # track the action in the main dict
    game_player_ix[(game, player)].append(round)  # keep an index for lookups by player
    game_round_ix[(game, round)].append(player) # another index for lookups by round
def get_all_player_actions(game, player):
    return (game_dict[(game,player,round)] for round in game_round_ix[(game, player)]) # iterator
def get_all_round_actions(game, round):
    return (game_dict[(game,player,round)] for player in game_player_ix[(game, round)]) # iterator

我会推荐任何一个

  1. 编写一个类,该类具有将公共访问模式包装到嵌套映射的函数。
  2. 使用 sqlite3 数据库。

编辑:

我看错了这个问题,对不起。

我想不出一个单一的数据结构可以做到这一点,尽管稍微复制数据不会太糟糕。将玩家设为一个类,您可以让回合存储玩家的行动地图,还可以让玩家类包含该玩家执行的操作列表。

您可以存储一组元组,其中每个元组仅存储普通元组(game_id、player_id、round_number、动作)。您也可以只使用玩家名称的暂存字符串而不是 id。如果您不知道要执行什么分析,那么这种格式使每个字段都可以平等地进行统计分析,并且如果您觉得将来需要,可以轻松地转换为数据库中的存储。

也可以使用命名元组。

相关内容

最新更新