【问题标题】:Python data structure advicePython数据结构建议
【发布时间】:2012-05-29 15:38:45
【问题描述】:

我有一个关于 python 列表/字典的相当基本的问题,希望得到一些帮助。

我有一些与具有不同特性的电动汽车有关的数据。每个 EV 都有一个:

  • ID 例如12345
  • 电池尺寸,例如24
  • 一天中每五分钟的充电状态,例如00:05:00:1; 00:10:00 : 0.95

我该怎么做才最好?我一直在尝试列表/字典的各种组合,但不能完全让它工作。我希望能够通过以下方式访问数据:

EV['ID'][2]['Batt']['SOC'][5] which would return e.g. 0.95 or
EV[12345]['Batt']['SOC'][5]

我最近的尝试是:

EV = defaultdict(lambda: defaultdict(dict))

EV['ID']['Batt']['Time']=[]
EV['ID']['Batt']['SOC']=[]
EV['ID']['Batt']['Size'] = 24

但是,这不允许输入另一个列表 admin['ID'] 中的多个 ID。它产生了:

{'ID': defaultdict....,{'Batt':{'SOC:[], 'Size':24, 'Time':[]}}}}

感谢您的帮助!

【问题讨论】:

  • 所以要明确一点,每辆车都有唯一的 ID 并且只有一种尺寸的电池?但是对于每辆车,一天中每五分钟都有一个充电水平?
  • 是的,Max.

标签: python dictionary data-structures


【解决方案1】:
from collections import defaultdict
import datetime

class ElectricVehicle(object):
    ev_by_id = {}
    ev_by_battery = defaultdict(list)

    @classmethod
    def find(cls, id=None, battery=None):
        if id is not None:
            return [cls.ev_by_id[id]]
        elif battery is not None:
            return cls.ev_by_battery[battery]
        else:
            return []

    def __init__(self, id, battery, states):
        self.id = id
        ElectricVehicle.ev_by_id[id] = self

        self.battery = battery
        ElectricVehicle.ev_by_battery[battery].append(self)

        self.states = list(states)

    def state_at(self, time):
        return self.states[(time.hour*60 + time.minute)/5]

ElectricVehicle(12345, 24, [0.99, 0.99, 0.99])
ElectricVehicle(12346, 30, [0.90, 0.90, 0.89])

evs = ElectricVehicle.find(battery=24)
for ev in evs:
    time = datetime.time(0,3,0)    # 00:03:00
    print("{}: {}".format(ev.id, ev.state_at(time)))

# will print "12345: 0.99"

【讨论】:

  • 太棒了!谢谢你加倍努力,休!
【解决方案2】:

完全使用对象可能是一个更好的选择,但这可能取决于细节。要仅使用列表和字典执行此操作,我将执行以下操作:

有一个由车辆 ID 键入的字典,每个条目是一个包含两个条目的字典,batterychargebattery 条目将仅包含电池的大小作为整数或任何需要的值。 charge 条目将是从 0 开始索引的电荷读数列表。

evs = {10001: {battery: 24, charge: [95, 90, ...]}, 11002: { ... }, ...}

然后您可以从其 ID 中获取给定 EV 的电池容量:

evs[id]['battery']

或者获取给定 ID 在给定时间段内的费用读数:

evs[id]['charge'][120] # corresponds to 10:00:00 to 10::05:00

显然,您可以像其他一些发帖人所建议的那样,制作一个很好的函数来进行时间/索引转换。

【讨论】:

  • 谢谢 Max,看起来对象是我所追求的,尽管您的解决方案也可以完成我可能会回来的工作。
  • 没问题,我觉得他们可能会,但其他答案似乎已经涵盖了。
猜你喜欢
  • 2013-03-25
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2013-09-26
  • 1970-01-01
  • 2012-01-06
相关资源
最近更新 更多