关于合适的数据结构的问题:
我有五个变量,它们有不同的值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]