24

私の質問は、辞書のキーに関するものです。単一のオブジェクトに対して 3 つのキーを持つ辞書を設定したいと考えています。キーは順番に並んでいる必要があり、幅広い値を持つことができます。例えば、

dictionary = {(key1,key2,key3) : object}

key1 は 1 から 10 の間の任意の値にすることができます key2 は 11 から 20 の間の任意の値にすることができます key3 は 21 から 30 の間の任意の値にすることができます

キーを配置する順序は重要です。

より具体的には、私のキーは、多くのオブジェクトが浮かんでいる x、y、z デカルト座標の範囲に対応しています。オブジェクトの相対位置を x、y、z 位置に基づいてソートできるようにしたいと考えています。

これを設定する方法はありますか、それとも別のアプローチを取る必要がありますか? 助けてくれてありがとう!

4

4 に答える 4

13

このための単一の文字列キーを作成するだけでなく、','.join([k1,k2,k3]) のようなキーの文字列結果をマージすることもできます

辞書の詳細をお読みください。

ディクショナリはキーによってインデックス付けされます。キーは不変の型にすることができます。文字列と数字は常にキーになることができます。タプルに文字列、数値、またはタプルのみが含まれている場合は、タプルをキーとして使用できます。タプルに可変オブジェクトが直接的または間接的に含まれている場合、それをキーとして使用することはできません。リストはインデックスの割り当て、スライスの割り当て、または append() や extend() などのメソッドを使用してその場で変更できるため、リストをキーとして使用することはできません。

タプルをキーとして使用しようとしても、これで問題ありません。

Python の辞書はソートされていないことに注意してください。これには collections.OrderedDict を使用できます。また、正しい並べ替えを作成するには、パラメーター キーを指定してsort/sorted 関数を使用し、必要な方法で並べ替えます。

編集されたサンプル:

from itertools import product
myDict = {}
for x,y,z in product(range(10), range(10,20), range(20,30)):
    myDict[(x,y,z)] = sum([x,y,z])
于 2012-11-23T04:26:30.453 に答える
5

うまくいけば、これがお役に立てば幸いです。

>>> from math import sqrt
>>> def dist(p1, p2):
...     x1, y1, z1 = p1
...     x2, y2, z2 = p2
...     xd = x1 - x2
...     yd = y1 - y2
...     zd = z1 - z2
...     return sqrt((xd ** 2 + yd ** 2 + zd ** 2))
>>> myPoint = (0,0,0)
>>> class MyObject: pass
>>> myDict = {(1,2,3):MyObject(), (4,5,6):MyObject()}
>>> sorted([dist(myPoint, point) for point in myDict])
10: [3.7416573867739413, 8.774964387392123]
于 2012-11-23T04:46:30.353 に答える
2

キー (順序付けられたトリプル) から値 (オブジェクト) へのマッピングのおそらく順序付けられていないコレクションが必要なようです。その場合、順序付きトリプルから複合キーを作成するのは非常に簡単です。

がx obj0,y,z 座標(10,20,30)にあり、obj1が x,y,z 座標にあるとし(11,21,31)ます。それで:

myObjects = {(10,20,30): obj0,
             (11,21,31): obj1
            }

tuples とints の両方が不変型であるため、これは機能します

それが役立つことを願っています

于 2012-11-23T05:02:49.273 に答える