63706


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

**test.py**

[code]

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

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

[code]

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

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

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

**test2.py**

[code]

    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)
    
[/code]

**test2.pyの出力結果**

[code]

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

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

**test3.py**

[code]

    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)
    
[/code]

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


CC BY-SA 4.0
2020-03-09T07:33:25.683
63690
2020-03-10T01:22:53.810
2020-03-09T07:44:59.503
36446
36446
question
python
Pythonでスマートに辞書型の中に配列を定義する方法


`mydict = {}`の代りに`mydict =
{'time':[],'time10sec':[],'time20sec':[]}`では駄目なのでしょうか？  
こんな風に。

[code]

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


CC BY-SA 4.0
2020-03-09T07:59:24.137
63691
2020-03-09T07:59:24.137
26370
63690
answer


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

[code]

    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)
    
[/code]


CC BY-SA 4.0
2020-03-09T15:04:56.323
63706
2020-03-09T15:04:56.323
8324
63690
answer


内包表記で

[code]

    from itertools import repeat
    import time
    
    t = time.time()
    mydict = {k: [t + p] * 3
              for k, p in [["time", 0], ["time10sec", 10], ["time20sec", 20]]}
    
[/code]

とか。

普通のループだと

[code]

    mydict = {}
    t = time.time()
    for k, p in [["time", 0], ["time10sec", 10], ["time20sec", 20]]:
        mydict.setdefault(k, []).extend([t + p] * 3)
    
[/code]

とか。

* * *

コードと結果が合致してないように見えるので正解がわかりませんが、それは追記していただくとして、ひとまず。

* * *

正直なところスマートに書く方法なんてたくさんあるのですけれど、スマートさよりも **ずっと大事**
なのは、どの部分が「将来変更される可能性が高い」か「将来にわたって不変である可能性が高い」かだと思いました。  
それで方針が変わるだろう、と。


CC BY-SA 4.0
2020-03-10T01:04:06.963
63711
2020-03-10T01:22:53.810
2020-03-10T01:22:53.810
12274
12274
63690
answer