27

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

// 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()): のようなものを使用して推測します。存在する場合はデータを追加し、そうでない場合は作成します辞書の値として空のリストを作成し、次のループでデータを追加します。

4

4 に答える 4

72

を見ようよ

d[t].append(c)

の値はd[t]? それを試してみてください。

d = {}
t = 0
d[t]

あなたは何を得ますか?おー。dのキーを持つものは何もありませんt

これを試してみてください。

d[t] = []
d[t]

ああ。今d、 のキーを持つ何かがありますt

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

  1. 使用例 2。
  2. を使用しsetdefaultます。 d.setdefault(t,[]).append(c).
  3. collections.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欠落しているキーに対して新しい空のリストが作成されるように関数を提供します。

于 2008-11-29T13:46:42.053 に答える
12

setdefault を使いたいと思います。使い方は少し変ですが、必要なことは正確に行います。

d.setdefault(t, []).append(c)

この.setdefaultメソッドは、キーが存在する場合、辞書のキーにバインドされている要素 (この場合はリスト) を返しtます。そうでない場合は、空のリストをキーにバインドしてt返します。いずれにしても、.appendメソッドがタプルcを追加できるリストがそこにあります。

于 2008-11-29T14:28:09.927 に答える
1
dict=[]  //it's not a dict, it's a list, the dictionary is dict={}
elem=[1,2,3]
dict.append(elem)

この方法で単一の要素にアクセスできます。

print dict[0] // 0 is the index

出力は次のようになります。

[1, 2, 3]
于 2008-11-29T13:53:34.007 に答える
1

データがまだ目的の基準でソートされていない場合は、データをグループ化するのに役立つコードを次に示します。

#!/usr/bin/env python
"""
$ cat data_shuffled.txt
0,2,7
1,4,7
0,4,7
1,9,0
1,2,5
0,6,7
1,6,8
0,9,5
"""
from itertools   import groupby
from operator    import itemgetter

# load the data and make sure it is sorted by the first column
sortby_key = itemgetter(0)
data = sorted((map(int, line.split(',')) for line in open('data_shuffled.txt')),
              key=sortby_key)

# group by the first column
grouped_data = []
for key, group in groupby(data, key=sortby_key):
    assert key == len(grouped_data) # assume the first column is 0,1, ...
    grouped_data.append([trio[1:] for trio in group])

# print the data
for i, pairs in enumerate(grouped_data):
    print i, pairs

出力:

0 [[2, 7], [4, 7], [6, 7], [9, 5]]
1 [[4, 7], [9, 0], [2, 5], [6, 8]]
于 2008-12-01T22:54:25.863 に答える