3

是否有一种标准方法来表示包含 Python 中一些关系数据的表?我的意思是,像这样:

      Singular   Plural
1st.  I make     we make
2nd.  you make   you make
3d.   he makes   they make

我希望数据可以按行和按列访问,如下所示:

1st. Singular -> I make
1st.          -> I make, we make
Plural 3d.    -> they make
Plural        -> we make, you make, they make

我看不到任何有效存储数据的方法,没有冗余。我能想到的更好的是使用多个字典(每行一个,每列一个),每个字典都包含与字典本身关联的行或列一样多的键,加上一个包含所有关联的特殊键价值观。

我想这样的事情已经解决了,这就是我问的原因。

4

2 回答 2

4

作为我其他答案的替代方案,您可以namedtuple按照@jamylak 的建议使用:

from collections import namedtuple

class Verb(namedtuple("_Verb",  # arbitrary class name/tag
                      ["singular1", "singular2", "singular3",
                       "plural1", "plural2", "plural3"])):
    @property
    def singular(self):
        return (self.singular1, self.singular2, self.singular3)

    # similarly for plural

    @property
    def first_person(self):
        return (self.singular1, self.plural1)

    # similarly for 2nd and 3rd person

现在“make”可以表示为

Verb("make", "make", "makes", "make", "make", "make")

同样,这可以通过利用英语变位的简单性来优化。

此解决方案的缺点是它不允许更改表中的单个字段,因为namedtuple它是不可变的。如果要进行更改,请使用普通class的 with __slots__

于 2013-04-25T10:37:47.140 回答
2

您可以通过将每个动词表示为扁平元组来消除冗余:

("make", "make", "makes", "make", "make", "make")

然后创建一个dict到索引的映射键:

ind_from_key = {'1st': (0, 3),
                ...,
                'singular': (0, 1, 2),
                ...,
                '1st singular': (0,)}

当然,查找变得有点复杂,因为您必须进行间接查找:

def conjugation(verb, conj):
    indices = ind_from_key[conj]
    return [CONJUGATION[verb][i] for i in indices]

请注意,英语动词的变位很简单,可以进行进一步优化;复数形式在语法人之间总是相同的。

至于最初的问题:不,在 Python 中没有表示关系数据的单一标准方法。如果您的关系变得比语言变位更复杂,并且您有大量数据,那么您可能想要研究SQLite或其他数据库解决方案,也许与SQLAlchemy结合使用。

于 2013-04-25T10:30:13.763 回答