创建由string索引的python 2d数组

时间:2014-02-23 22:44:37

标签: python arrays

(我在python上不太好,如果这是一个愚蠢的问题,请原谅我)

所以我想创建一个代表这个的数据结构 -

      word1   word2
word3   1      2
word4   3      4

现在我尝试过这样的事情 -

self.table = [][]

但是这给了我一个无效的语法错误(我猜是因为我没有初始化数组?)。但是,即使我使用它,我也无法使用它,因为我不知道我的x和y维度有多大(似乎会有一个索引异常的数组)。

我应该使用双字典吗?我该怎么用?

4 个答案:

答案 0 :(得分:0)

我们的想法是创建一个字典,将字符串映射到indeces。在下面有一个小类重载'[]' - 运算符:

class ArrayStrIdx:
    """ 2D Array with string as Indeces

    Usage Example::

        AA = ArrayStrIdx()
        AA["word1", "word3"] = 99
        print(AA["word2", "word5"])
    """

    cols ="word1 word2"
    rows ="word3 word4 word5"

    dd = [[10,11,12],[20,21,22]]  # data

    def __init__(self):
        """ Constructor builds dicts for indexes"""
        self.ri = dict([(w,i) for i,w in enumerate(self.rows.split())])
        self.ci = dict([(w,i) for i,w in enumerate(self.cols.split())])

    def _parsekey(self, key):
        """ Convert index key to indeces for ``self.dd`` """
        w0, w1 = key[0], key[1]
        return self.ci[w0], self.ri[w1]

    def __getitem__(self, key):
        """ overload [] operator - get() method"""
        i0, i1 = self._parsekey(key)
        return self.dd[i0][i1]

    def __setitem__(self, key, value):
        """ overload [] operator -  set() method """
        i0, i1 = self._parsekey(key)
        self.dd[i0][i1] = value

更新:扩展回答以允许AA["word1", "word3"] = 23之类的内容。

答案 1 :(得分:0)

也许您可以尝试使用

初始化您的表格
self.table = {r : { c : 0 for c in ['word1', 'word2']} for r in ['word3', 'word4']}

然后您可以通过

访问每个职位
self.table['word3']['word1'] = 2

答案 2 :(得分:0)

Python没有现成的指令来创建二维矩阵,但使用列表推导很容易做到:

matrix = [[0] * cols for i in range(rows)]

然后您可以使用例如

访问矩阵
matrix[row][col] += 42

假设rows=10cols=20,则row索引必须从0到9,col索引从0到19.您还可以使用负索引来表示从最后算起;例如

matrix[-1][-1] = 99

将最后一个单元格设置为99

答案 3 :(得分:0)

如果您不反对使用外部库,可以查看

Pandas Data Frames