Python复杂的字典键

时间:2012-11-23 04:23:01

标签: python dictionary key

我的问题与字典键有关。我想设置一个包含任意单个对象的3个键的字典。键必须按顺序排列,并且可以具有多种值。例如,

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

key1可以是1到10之间的任何值 key2可以是11到20之间的任何值 key3可以是21到30之间的任何值

按键的放置顺序很重要。

更具体地说,我的键对应于一系列x,y,z笛卡尔坐标,其中许多物体漂浮在其中。我希望能够根据x,y,z对对象的相对位置进行排序位置。

有什么方法可以设置它,还是我必须采取不同的方法? 谢谢你的帮助!

4 个答案:

答案 0 :(得分:12)

当然,您可以为此创建单个字符串键 - 只需为您的键合并字符串结果,例如','。join([k1,k2,k3])

Read more about dictionaries.

  

字典由键索引,键可以是任何不可变类型;   字符串和数字总是键。如果,元组可以用作键   它们只包含字符串,数字或元组;如果一个元组包含任何元组   可变对象直接或间接,它不能用作   键。您不能将列表用作键,因为列表可以就地修改   使用索引分配,切片分配或append()等方法   和extend()。

所以你试图用元组作为键,这没关系。

请注意,python中的字典未排序。您可以使用collections.OrderedDict。另外,为了构建正确的排序,请使用指定参数键的sort/sorted functions来对您想要的方式进行排序。

EDITED示例:

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])

答案 1 :(得分:4)

希望你会发现这很有用。

>>> 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]

答案 2 :(得分:2)

在我看来,你想要一个可能无序的从键(有序三元组)到值(对象)的映射集合。如果是这种情况,可以很容易地从有序三元组中制作复合键:

假设obj0位于x,y,z坐标(10,20,30),而obj1位于x,y,z坐标(11,21,31)。然后:

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

这是有效的,因为tupleint都是不可变类型

希望有所帮助

答案 3 :(得分:0)

我解决了这个问题:

list = [
         [1,'a','school'],
         [2,'b','church'],
         [3,'c','library'],
         [4,'d','station']
    ]
dic_key = {}
for i in list:
   if (i[0],i[1]) not in dic_key:
      dic_key[i[0],i[1]] = []
   dic_key[i[0],i[1]].append(i[2])

print(dic_key)

输出:{(1, 'a'): ['school'], (2, 'b'): ['church'], (3, 'c'): ['library'], (4 , 'd'): ['站']}