Pythonic方式重新映射数据结构

时间:2018-03-12 05:10:21

标签: python json data-structures

我在这里获得了Data这样的数据结构:

Data.whatever.t       # (contains time)
Data.whatever.log.vel # (contains velocity)
Data.a                # (contains acceleration)

我希望以优雅/ pythonic的方式将它们映射到一个对象,以便我有:

data.t
data.velocity
data.acceleration

我正在考虑使用json文件来硬编码映射,例如:

{
  "Data": [
     {
       "t": "whatever.t",
       "velocity": "whatever.log.vel",
       "acceleration": "a",
     },
  ]
}

但我不知道如何从这里开始。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我建议创建一个proxy class来更改结构的界面,这听起来就像你追求的那样。

取决于你的情况"给予"这个结构(看起来像一个类属性指向其他对象的类)你可以把它作为你的类的参数,或者实例化你自己。例如,如果您将此结构作为输入传递:

from types import SimpleNamespace # for mimicking your "Data" structure

# creating this:
# Data.whatever.t       # (contains time)
# Data.whatever.log.vel # (contains velocity)
# Data.a                # (contains acceleration)

Data = SimpleNamespace(
    a='someacceleration',
    whatever=SimpleNamespace(
        t='sometime',
        log=SimpleNamespace(
            vel='somevelocity'
        )
    )
)

# Relevant part of solution
class ProxyClass:
    def __init__(self, somedata):
        self._proxy_data = somedata
        self.t = self._proxy_data.whatever.t
        self.velocity = self._proxy_data.whatever.log.vel
        self.acceleration = self._proxy_data.a

演示:

In [2]: Data
Out[2]: namespace(a='someacceleration', whatever=namespace(log=namespace(vel='somevelocity'), t='sometime'))

In [3]: data = ProxyClass(Data)

In [4]: data.acceleration
Out[4]: 'someacceleration'

In [5]: data.velocity
Out[5]: 'somevelocity'

In [6]: data.t
Out[6]: 'sometime'

答案 1 :(得分:0)

也许你应该首先学习python class

一个简单的演示:

class T(object):
    pass
class Velocity(object):
    pass
class Acceleration(object):
    pass
class Data(object):    
    def __init__(self):
        self.t = T()
        self.velocity = Velocity()
        self.acceleration = Acceleration()


data = Data()
print(data.t)
print(data.velocity)
print(data.acceleration)