次のようなデータのリストがあります。
// 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
。
できることはいくつかあります。
- 例2を使用します。
- 使用
setdefault
。d.setdefault(t,[]).append(c)
。 - 使用コレクション.defaultdict
defaultdict(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
欠落しているキーに対して新しい空のリストが作成されるように関数を提供します。