4

数据的一些背景:正在玩一些不同的游戏,每个游戏都承载了许多玩家。每场比赛由若干轮组成,在每一轮中,每个参与的玩家都会做出一个动作。我在这里尝试做的是在内存中构建一个数据结构,用于存储玩家在所有正在玩的游戏中所采取的个人行动的完整历史。

一个明显的结构是一个深度嵌套的字典/哈希图,其中每个game_id映射到多个player_ids,每个 player_id 映射到不同round_number的 s,每个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 Performance Benchmark --Why is :memory: so slow...only 1.5X as fast as disk?

4

3 回答 3

3

一种方法是将数据存储在字典中,但维护索引以允许快速访问数据的各种视图。你可以用一个类来构造它,或者只是函数。这是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
于 2012-06-01T22:36:14.343 回答
1

我会推荐

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

编辑:

我误读了这个问题,对不起。

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

于 2012-06-01T22:02:10.187 回答
0

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

也可以使用命名元组。

于 2012-06-03T11:37:55.550 回答