我有五个变量,它们将根据它们是在阿拉斯加/美国还是在半分辨率/全分辨率下具有不同的值



关于合适的数据结构的问题:

我有五个变量,它们有不同的值string基于他们是否在美国/阿拉斯加和半/全分辨率

所以我正在构建一个5/2/2(数组或列表或字典)。

我想用x = DStr(var,'AK','H')访问它,例如…对于Alaska/half-res, OSP/UL/LR等变量的值是多少?

这是一个静态表,值不会改变。对于索引

,没有明显的顺序要求0、1、2。

问题是,数组不喜欢字符串索引和字典只需要一个键,而不是三个。

任何想法?

您可以使用元组来索引字典:

>>> values = {
...     ("AK", "H"): ("some", "sample", "data", "to", "return"),
...     ("AK", "F"): ("more", "sample", "data", "for", "you"),
...     # More data here
... }
>>> a, b, c, d, e = values[("AK", "H")]
>>> a
"some"

或者您可以使用字典的嵌套:

>>> values = {
...     "AK": {
...         "H": ("some", "sample", "data", "to", "return"),
...         "F": ("more", "sample", "data", "for", "you")
...     },
...     # Other nested dicts here
... }
>>> a, b, c, d, e = values["AK"]["H"]
>>> a
"some"

如果你有一个类结构来定义5个数据点作为单个对象的一部分(这将是一个好主意,保持数据分组在一起,如果它是相关的),你可以存储类的实例,而不是元组:

>>> values = {
...     ("AK", "H"): MyClass("some", "sample", "data", "to", "return"),
...     ("AK", "F"): MyClass("more", "sample", "data", "for", "you"),
...     # More data here
... }
>>> obj = values[("AK", "H")]
>>> obj.osp
"some"

>>> values = {
...     "AK": {
...         "H": MyClass("some", "sample", "data", "to", "return"),
...         "F": MyClass("more", "sample", "data", "for", "you")
...     },
...     # Other nested dicts here
... }
>>> obj = values["AK"]["H"]
>>> obj.osp
"some"

请记住,你的问题相当不清楚。我真的不明白你想要建模的数据的含义,我也不知道它将如何被使用。

也就是说,类是定义您自己的数据结构的好方法。在这种情况下,我猜你有OSP, UL, LR和"等等"。所以我要为它定义一个类:

class MyData:
    def __init__(self, osp, ul, lr, etc):
        self.osp = osp
        self.ul = ul
        self.lr = lr
        self.etc = etc

然后使查找表包含类的实例:

table = {
    'AK': {'H': MyData(1,5,20,'something'),
           'F': MyData(3,2,28,'spam') },
    'FL': {'H': MyData(42,5,20,'eggs'),
           'F': MyData(2,13,7,'ham') },
    }

那么我可以定义一个函数匹配你在你的问题中显示的签名。我忽略了论点var,因为你的问题没有告诉我任何关于它的信息。

def DStr(var, state, resolution):
    return table[state][resolution]

如果您有固定长度的两个字符串,它们将组成一个查找,您可以将它们连接在一起。可能比有一个值的字典更简单。值可以在列表中。

table = {'AKH': [1,"two",3.14],
        'AKF': [2,"four", 6.28]
        }
state = 'AK'
res   = 'F'
table[state+res]

输出
[2, 'four', 6.28]