![](/img/trans.png)
[英]create dictionary from multiple lists, where each list has not the values for one key, but each list has values for all keys
[英]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.