2017-09-04 58 views
0

我在Python中有以下代碼。它需要一個datimetime dt並檢查它是否屬於Type1Type2。如果沒有這些類型的被觸發,則None返回:如何用Json字符串替換給定的數據結構?

self.daytypes = { 
    'Type1': (
     date(2015, 3, 12), 
     date(2015, 4, 8) 
    ), 
    'Type2': (
     date(2015, 1, 4), 
     date(2015, 3, 9), 
     date(2015, 5, 25) 
    ) 
} 


def getDayType(self,dt): 
    holidays = [] 
    for d in self.daytypes: 
     holidays.extend(self.daytypes[d]) 

    wd = dt.isoweekday() 
    daytype = None 
    for t, ranges in self.daytypes.items(): 
     for day in ranges: 
      if (day == dt.date()): 
       daytype = t 
       break 
     if daytype is not None: 
      break 
    return daytype 

現在我想通過一個JSON字符串myJson取代數據結構self.daytypes

{"Type1":["2015-03-12","2015-04-08"],"Type2":["2015-01-04","2015-03-09","2015-05-25"]} 

有沒有簡單的方法來使它用最少的代碼更新?

+0

你想設置self.daytypes從你的json? –

+0

@MohideenibnMohammed:是的,我正在尋找一個最佳解決方案。在我看來,最優化的方法是從json中設置self.daytypes而不更改其餘代碼(即函數getDayType)。但是,如果你有另一個建議,那麼你非常歡迎。 – Dinosaurius

回答

1

你可以建立從JSON字符串使用字典理解數據結構,像這樣:

import json 
from datetime import datetime 

json_string = '''{"Type1":["2015-03-12","2015-04-08"],"Type2":["2015-01-04","2015-03-09","2015-05-25"]}''' 

daytypes = {k: [datetime.strptime(x, '%Y-%m-%d').date() for x in v] for k,v in json.loads(json_string).items()} 

>>> daytypes 
{'Type1': [datetime.date(2015, 3, 12), datetime.date(2015, 4, 8)], 'Type2': [datetime.date(2015, 1, 4), datetime.date(2015, 3, 9), datetime.date(2015, 5, 25)]} 

如果必須在有元組的字典,然後你可以將列表轉換爲字典理解中的元組:

daytypes = {k: tuple(datetime.strptime(x, '%Y-%m-%d').date() for x in v) for k,v in json.loads(json_string).items()} 
>>> daytypes 
{u'Type1': (datetime.date(2015, 3, 12), datetime.date(2015, 4, 8)), u'Type2': (datetime.date(2015, 1, 4), datetime.date(2015, 3, 9), datetime.date(2015, 5, 25))} 
0

可序列化器功能:

def toJSON(self): 
    return json.dumps(self, default=lambda o: o.__dict__, 
     sort_keys=True, indent=4) 
+0

您能否爲給定的輸入Json字符串發佈此函數的精確輸出? – Dinosaurius

+0

它看起來就像你想要的一樣。 – Vossen

+0

如果我這樣做了'daytypes = toJSON({「Type1」:[「2015-03-12」,「2015-04-08」],「Type2」:[「2015-01-04」,「2015-03 -09「,」2015-05-25「]})',然後運行我的代碼而不改變任何東西,我得到這個錯誤:'TypeError:字符串索引必須是整數,而不是str' – Dinosaurius