Pythonでスマートに辞書型の中に配列を定義する方法

投稿者: Anonymous

以下のように、Pythonで辞書型を使って”time”というキーに対して、現在時間の配列を持たせるコードを書きました。

test.py

import time
mydict = {}
timeList = []
for i in range(3):
    timeList.append(time.time())
    mydict["time"] = timeList
print(mydict)

test.pyの出力結果は以下のようになります。

{'time': [1583738314.135982, 1583738314.135982, 1583738314.135982]}

これは私が求めている通りの出力結果なのですが
出来れば3行目のtimeList = []をfor文の外で定義したくありません。

なぜなら、test2.pyのように辞書の中身を増やしたい場合に
どんどんプログラムの行数が増えていってしまうからです。

test2.py

import time
mydict = {}
timeList = []#現在の値のリスト
time10secList = []#10sec後の値のリスト
time20secList = []#20sec後の値のリスト
for i in range(3):
    timeList.append(time.time())
    mydict["time"] = timeList

    time10secList.append(time.time()+10)
    mydict["time10sec"] = time10secList

    time20secList.append(time.time()+20)
    mydict["time20sec"] = time20secList
print(mydict)

test2.pyの出力結果

{
'time': [1583738637.765196, 1583738637.765196, 1583738637.765196], 
'time10sec': [1583738647.765196, 1583738647.765196, 1583738647.765196],
 'time20sec': [1583738657.765196, 1583738657.765196, 1583738657.765196]
}

理想としては、test3.pyのような形で、短くまとめたいのですが、以下のコードだとエラーになってしまいます。

test3.py

import time
mydict = {}
for i in range(3):
    mydict["time"].append(time.time())
    mydict["time10sec"].append(time.time()+10)
    mydict["time20sec"].append(time.time()+20)
print(mydict)

どうしたらスマートに辞書型を定義し、配列を更新していけますか?

解決

collections.defaultdictを使うと以下のように書けます。

import time
import collections
mydict = collections.defaultdict(list)
for i in range(3):
    mydict["time"].append(time.time())
    mydict["time10sec"].append(time.time()+10)
    mydict["time20sec"].append(time.time()+20)
print(mydict)
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *