我的问题与字典中的关键字有关。我想建立一个字典,有3个关键字的任何单一的对象。键必须是有序的,并且可以有很大范围的值。例如,
dictionary = {(key1,key2,key3) : object}key1可以是1到10之间的任何值key2可以是11到20之间的任何值key3可以是21到30之间的任何值
键的放置顺序确实很重要。
更具体地说,我的关键点对应于x,y,z笛卡尔坐标的范围,其中有许多对象在其中浮动。我希望能够根据对象的x,y,z位置对对象的相对位置进行排序。
有没有办法设置它,或者我必须采取不同的方法?谢谢你的帮助!
发布于 2012-11-23 12:26:30
当然可以,也可以为此创建单个字符串键-只需合并键的字符串结果,如','.join(k1,k2,k3)
Read more about dictionaries.
字典通过键进行索引,键可以是任何不可变的类型;字符串和数字始终可以是键。如果只包含字符串、数字或元组,则可以将元组用作键;如果元组直接或间接包含任何可变对象,则不能将其用作键。您不能将列表用作键,因为可以使用索引分配、片分配或append()和extend()等方法在适当的位置修改列表。
因此,您尝试使用元组作为键,这是可以的。
请注意,python中的字典是不排序的。您可以使用collections.OrderedDict来实现这一点。此外,要构建正确的排序,请使用指定了参数键的sort/sorted functions来按您想要的方式进行排序。
编辑后的示例:
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-23 12:46:30
希望你会发现这一点很有用。
>>> 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-23 13:02:49
在我看来,您可能需要一个从键(有序的三元组)到值(对象)的映射的无序集合。如果是这样的话,很容易从一个有序的三元组中生成一个组合键:
假设obj0在x,y,z坐标(10,20,30)处,obj1在x,y,z坐标(11,21,31)处。然后:
myObjects = {(10,20,30): obj0,
(11,21,31): obj1
}这之所以可行,是因为tuple和int都是不可变类型。
希望这能有所帮助
https://stackoverflow.com/questions/13523070
复制相似问题