ツリーを構築するために必要なテキスト文字列のリストがあります。これを実現するための適切なデータ構造を理解しているので、辞書です。各文字列のサイズは固定されており、すべての要素の形式は同じであるため、追加のチェックは必要ありません。リストの各レコードはDD / MM / YYYYの形式の日付であり、年/年はツリーのルートにある必要があります(キー、ここでは重複はありません)。各年は複数の月である可能性があります(内に重複する月はありません)同じ年)値として、毎月複数日(同じ月内に重複する日はありません)。
文字列のリストの例:
データ= ['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 ']
解決策のほかに、何か提供できるものがあれば、理解するために説明もお願いします。
これは私がこれまでに書いたものですが、結果は最後の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']}}
これを実現するにはさまざまな方法があります。あなたは可能性が使用defaultdict
からcollections
モジュール。ただし、プレーンなdict.setdefault
方法を使用して実行することもできます。
setdefault(key[, default])
キーが辞書にある場合は、その値を返します。そうでない場合は、defaultの値でキーを挿入し、defaultを返します。デフォルトのデフォルトはNoneです。
データをループして、日、月、年の文字列に分割します。次に、ベースツリーで年キーを探し、それが存在しない場合は、新しい空のdictを作成します。次に、その年の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つのステップを1行にまとめることはできますが、読むのは少し難しいです。
for s in data:
day, mon, year = s.split('/')
tree.setdefault(year, {}).setdefault(mon, []).append(day)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加