2

Python のリスト/辞書に関して、かなり基本的な質問があります。

さまざまな特性を持つ電気自動車に関するデータがいくつかあります。各 EV には次のものがあります。

  • ID 例: 12345
  • バッテリーサイズ 例:24
  • 1 日の 5 分間ごとの充電状態。例: 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':[]}}}}

助けていただければ幸いです。

4

2 に答える 2

3
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"
于 2012-05-29T15:53:22.373 に答える
3

オブジェクトでそれを行うことは、全体としてより良いオプションかもしれませんが、それはおそらく詳細に依存します..リストと辞書だけでこれを行うには、次のようにします:

各エントリが 2 つのエントリを持つディクショナリである、車両の ID をキーとするディクショナリを作成しbatteryますcharge。エントリには、バッテリーのbatteryサイズが整数または必要なものとして含まれているだけです。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

明らかに、他のポスターの一部が示唆しているように、その時間/インデックスの変換を行うための優れた関数を作成できます。

于 2012-05-29T16:04:41.243 に答える