我的问题与字典键有关。我想设置一个包含任意单个对象的3个键的字典。键必须按顺序排列,并且可以具有多种值。例如,
dictionary = {(key1,key2,key3) : object}
key1可以是1到10之间的任何值 key2可以是11到20之间的任何值 key3可以是21到30之间的任何值
按键的放置顺序很重要。
更具体地说,我的键对应于一系列x,y,z笛卡尔坐标,其中许多物体漂浮在其中。我希望能够根据x,y,z对对象的相对位置进行排序位置。
有什么方法可以设置它,还是我必须采取不同的方法? 谢谢你的帮助!
答案 0 :(得分:12)
当然,您可以为此创建单个字符串键 - 只需为您的键合并字符串结果,例如','。join([k1,k2,k3])
字典由键索引,键可以是任何不可变类型; 字符串和数字总是键。如果,元组可以用作键 它们只包含字符串,数字或元组;如果一个元组包含任何元组 可变对象直接或间接,它不能用作 键。您不能将列表用作键,因为列表可以就地修改 使用索引分配,切片分配或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
}
这是有效的,因为tuple
和int
都是不可变类型
希望有所帮助
答案 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'): ['站']}