9

C++ では、次のようなことがよくあります。

typedef map<int, vector<int> > MyIndexType;

次に、次のように使用します。

MyIndexType myIndex;
for( ... some loop ...)
{
  myIndex[someId].push_back(someVal);
}

マップにエントリがなかった場合、コードは新しい空のベクターを挿入し、それに追加します。

Python では、次のようになります。

myIndex = {}

for (someId,someVal) in collection:
   try:
      myIndex[someId].append(someVal)
   except KeyError:
      myIndex[someId] = [someVal]

try except はここでは少し醜いです。ディクショナリ宣言時に KeyError が発生したときに挿入するオブジェクト タイプをディクショナリに伝える方法はありますか?

4

5 に答える 5

15

使用したい:

from collections import defaultdict
myIndex = defaultdict(list)
myIndex[someId].append(someVal)

標準ライブラリdefaultdictオブジェクト

Python ドキュメントの使用例:

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
        d[k].append(v)

>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
于 2008-11-27T21:10:23.247 に答える
10

おそらくこのようなもの:

myIndex = {}
for (someId,someVal) in collection:
    myIndex.setdefault(someId, []).append(someVal)
于 2008-11-27T21:06:08.997 に答える
2

Alastair による回答を完成させるために: get と呼ばれる setdefault に相当する get もあります(考えられるように、getdefault ではありません)。

myIndex = {}
someId = None
myList = myIndex.get(someId, []) # myList is [] now
于 2008-11-27T22:04:32.623 に答える
1

Python 2.5 以降では、setdefault の動作を取得するか、defaultdict を実装することで使用できます。

__missing__(k)

注10のようにここに

于 2008-11-27T22:12:21.687 に答える
0

これはどう?パフォーマンスが最適ではないかもしれませんが、「おそらく機能する最も単純なもの」だと思います。

myIndex = {}

for (someId,someVal) in collection:
   if someId not in myIndex:
       myIndex[someId] = []
   myIndex[someId].append(someVal)
于 2008-11-27T21:14:37.670 に答える