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。此外,要构建正确的排序,请使用带有指定参数键的排序/排序函数来按照您想要的方式排序。

编辑样本:

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

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

假设obj0在 x,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 回答
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 '): ['车站']}

于 2021-05-03T15:45:12.560 回答