2012-05-29 5 views
2

나는 파이썬 목록/I가 약간의 도움이 필요 사전에 대한 매우 기본적인 질문이 있습니다.파이썬 데이터 구조 조언

나는 다른 특성을 가지고 전기 자동차에 관한 일부 데이터를 가지고있다.

  • ID 예컨대 각 EV는 보유 12345
  • 배터리 크기. 24
  • 예컨대 하루의 각 오분 동안 충전 상태 00:05:00 : 1; 0시 10분 0초는 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 

그러나이 다른 목록에 여러 ID의 항목을 허용하지 않았다 관리자 [ 'ID']. 산출 :

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

도움을 주셔서 감사합니다. 객체와 그 일을

+1

그래서 단지 명확하게하기 위해, 모든 차량은 고유 ID와 배터리의 단 하나 개의 크기는? 그러나 모든 차량에는 하루 5 분마다 요금이 부과됩니까? –

+0

네, 그게 맞습니다. – user578582

답변

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" 
+0

Brilliant! 휴를 보내 주셔서 감사합니다! – user578582

3

은 모두 더 좋은 옵션이 될 수도 있지만, 아마 다음 작업을 수행 할 것입니다 단지리스트와 사전에이 작업을 수행하려면 ... 세부 사항에 따라 달라집니다

이 사전에 의해 키가 적이을 각 항목이있는 차량의 ID는 두 개의 항목, batterycharge의 사전입니다. battery 엔트리는 배터리의 크기를 정수 또는 필요로하는 것만 포함합니다. charge 항목은 다음 당신은 ID에서 주어진 EV의 배터리 크기를 얻을 수 0

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

에서 인덱스 충전 판독의 목록이 될 것입니다 :

evs[id]['battery'] 

또는 독서를 요금을 얻을 주어진 ID에 대해 주어진 기간 : TEH 다른 포스터 중 일부는 제안으로

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

은 분명히 당신은 시간/인덱스 변환을 할 수있는 좋은 기능을 만들 수 있습니다.

+0

고마워 맥스, 당신의 솔루션은 내가 다시 올 수있는 일을하고 있지만, 내가 쫓아 오는 것 인 것처럼 보인다. – user578582

+0

아무런 문제도 없었습니다.하지만 다른 답변은 그 문제를 다루는 것 같았습니다. –

관련 문제