【问题标题】:Pythonic way to re-map a data structurePythonic 重新映射数据结构的方法
【发布时间】:2018-03-12 05:10:21
【问题描述】:

我在这里得到了像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",
     },
  ]
}

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

【问题讨论】:

  • 你可以使用 dict。喜欢 Data.__dict__
  • 你是如何“给定”这个结构的?

标签: python json data-structures


【解决方案1】:

我建议创建一个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'

【讨论】:

    【解决方案2】:

    也许你应该先学习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)
    

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2023-04-09
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多