Python 辞書にリストを保存および更新する: なぜこのようなことが起こるのでしょうか? 質問する

Python 辞書にリストを保存および更新する: なぜこのようなことが起こるのでしょうか? 質問する

次のようなデータのリストがあります。

// timestep,x_position,y_position
0,4,7
0,2,7
0,9,5
0,6,7
1,2,5
1,4,7
1,9,0
1,6,8

...そして、これを次のようにしたいのです:

0, (4,7), (2,7), (9,5), (6,7)
1, (2,5), (4,7), (9,0), (6.8)

私の計画は、辞書を使うことでした。t の値は辞書のキーとなり、キーに対する値はリストになります。そして、各 (x,y) をリストに追加します。次のようになります。

# where t = 0, c = (4,7), d = {}

# code 1
d[t].append(c)

これで IDLE が失敗します。ただし、次の操作を行うと:

# code 2
d[t] = []
d[t].append(c)

...これは機能します。

それで疑問は、なぜコード 2 は機能するのに、コード 1 は機能しないのかということです。

PS 私が計画していることの改善があれば、とても興味深いです!! 入力の各ループで辞書をチェックして、辞書キーがすでに存在するかどうかを確認する必要があると思います。おそらく、max(d.keys()) のようなものを使用すると思います。存在する場合はデータを追加し、存在しない場合は辞書値として空のリストを作成し、次のループでデータを追加します。

ベストアンサー1

を見ようよ

d[t].append(c)

の値は何ですかd[t]? 試してみましょう。

d = {}
t = 0
d[t]

d何が得られますか? ああ。には のキーを持つものは何もありませんt

ではこれを試してみましょう。

d[t] = []
d[t]

dああ。今、のキーで何かが入っていますt

できることはいくつかあります。

  1. 例2を使用します。
  2. 使用setdefaultd.setdefault(t,[]).append(c)
  3. 使用コレクション.defaultdictdefaultdict(list)単純な辞書の代わりにを使用します{}

編集1.最適化

ファイルからの入力行が上記の形式 ts, x, y である場合、グループ化プロセスは不要です。単純な ( ts, x, y ) リストから、より複雑な ( ts, (x,y), (x,y), (x,y), ... ) リストに移行する理由はありません。元のリストは、到着したとおりに処理できます。

d= collections.defaultdict(list)
for ts, x, y in someFileOrListOrQueryOrWhatever:
    d[ts].append( (x,y) )

編集2. 質問に回答

「辞書を初期化するときに、キーと値のデータ構造がどのようになるかを辞書に伝える必要がありますか?」

質問の意味がよく分かりません。すべての辞書はキー値構造では、質問があまり明確ではありません。そこで、質問に答えられるかもしれない 3 つの代替案を検討します。

例2

初期化

d= {}

使用

if t not in d:
    d[t] = list()
d[t].append( c )

各辞書の値は、何らかの有用な構造に初期化する必要があります。この場合、キーが存在するかどうかを確認します。キーがない場合は、キーを作成して空のリストを割り当てます。

デフォルト設定

初期化

d= {}

使用

d.setdefault(t,list()).append( c )

この場合、setdefaultメソッドを利用して、キーに関連付けられた値を取得するか、欠落しているキーに関連付けられた新しい値を作成します。

デフォルトの辞書

初期化

import collections
d = collections.defaultdict(list)

使用

d[t].append( c )

defaultdict、欠落しているキーに対して初期化関数を使用します。この場合、list欠落しているキーに対して新しい空のリストが作成されるように関数を提供します。

おすすめ記事