簡體   English   中英

從包含每個鍵的多個uniqe值的字符串列表創建3級字典

[英]Create a 3 level dictionary from a list of strings with multiple uniqe values for each key

我有一個文本字符串列表,我需要從中構建一個樹,據我所知,實現這一目的的正確數據結構是一個字典。 每個字符串的大小都是固定的,所有元素的格式都是相同的,因此不需要進行額外的檢查。 列表的每個記錄都是DD / MM / YYYY格式的日期,年份/年份應該在樹的根上(密鑰,這里沒有重復),每年可能是多個月(沒有重復的月份)同一年)作為價值和每個月多天(同一個月內沒有重復的天數)。

字符串列表的示例:

data = ['04 / 02/2018','05/02/2018','06/02/2018','01/03/2018','10 / 03/2018','08/09/2017' ,'09 / 2017/2017','11 / 10/2017','11 / 12/2017','14 / 06/2018','15/06/2018','24/07/2018',' 26/07/2018','30 / 08/2018','31/08/2018','01/09/2018']

除了解決方案,如果有任何可以提供,我也想要解釋,以便理解。

這是我到目前為止寫的,這顯然是錯誤的,因為結果是一個只有最后2項的字典。

d = {}
for item in data:
    rec = item.split('/')
    d.update({rec[2]:{rec[1]:(rec[0])}})

該數據的所需輸出如下所示:

{'2017': {'09': ['08', '09'], '10': ['11'], '12': ['11']},
 '2018': {'02': ['04', '05', '06'],
          '03': ['01', '10'],
          '06': ['14', '15'],
          '07': ['24', '26'],
          '08': ['30', '31'],
          '09': ['01']}}

有各種方法來實現這一目標。 可以使用collections模塊中的defaultdict 但也可以使用plain dict.setdefault方法完成。

setdefault(key[, default])

如果key在字典中,則返回其值。 如果沒有,插入默認和返回默認的關鍵 默認默認為

我們遍歷數據,將其分為日,月和年字符串。 然后我們在基礎樹中查找年份密鑰,如果它不存在,我們為它創建一個新的空字典。 然后我們查看當年dict中的一個月密鑰,如果它不存在則為它創建一個新列表。 最后,我們將日期字符串附加到月份列表中。

from pprint import pprint

data = [
    '04/02/2018', '05/02/2018', '06/02/2018', '01/03/2018', '10/03/2018', '08/09/2017', '09/09/2017',
    '11/10/2017', '11/12/2017', '14/06/2018', '15/06/2018', '24/07/2018', '26/07/2018', '30/08/2018',
    '31/08/2018', '01/09/2018'
]

tree = {}

for s in data:
    day, mon, year = s.split('/')
    ydict = tree.setdefault(year, {})
    mlist = ydict.setdefault(mon, [])
    mlist.append(day)

pprint(tree)

產量

{'2017': {'09': ['08', '09'], '10': ['11'], '12': ['11']},
 '2018': {'02': ['04', '05', '06'],
          '03': ['01', '10'],
          '06': ['14', '15'],
          '07': ['24', '26'],
          '08': ['30', '31'],
          '09': ['01']}}

我們可以將主循環的3個步驟合並為一行,但它有點難以理解:

for s in data:
    day, mon, year = s.split('/')
    tree.setdefault(year, {}).setdefault(mon, []).append(day)

你不需要一棵樹。 您可以使用dicts的dict,將列表作為最內層的值。

您可以使用defaultdict作為主結構

result = defaultdict(defaultdict(list))

for date in data:
    day, month, year = date.split('/')
    result[year][month].append(day)

defaultdict作用是什么

  • 對於內部詞典:你可以直接append 如果沒有列表,則創建一個新的空列表。
  • 對於外部字典:類似地,您可以參考關鍵month假設已經有一個字典作為其值。 如果沒有,則創建一個新的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM