首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python复杂字典键

Python复杂字典键
EN

Stack Overflow用户
提问于 2012-11-23 12:23:01
回答 4查看 17.1K关注 0票数 24

我的问题与字典中的关键字有关。我想建立一个字典,有3个关键字的任何单一的对象。键必须是有序的,并且可以有很大范围的值。例如,

代码语言:javascript
复制
dictionary = {(key1,key2,key3) : object}

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

键的放置顺序确实很重要。

更具体地说,我的关键点对应于x,y,z笛卡尔坐标的范围,其中有许多对象在其中浮动。我希望能够根据对象的x,y,z位置对对象的相对位置进行排序。

有没有办法设置它,或者我必须采取不同的方法?谢谢你的帮助!

EN

回答 4

Stack Overflow用户

发布于 2012-11-23 12:26:30

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

Read more about dictionaries.

字典通过键进行索引,键可以是任何不可变的类型;字符串和数字始终可以是键。如果只包含字符串、数字或元组,则可以将元组用作键;如果元组直接或间接包含任何可变对象,则不能将其用作键。您不能将列表用作键,因为可以使用索引分配、片分配或append()和extend()等方法在适当的位置修改列表。

因此,您尝试使用元组作为键,这是可以的。

请注意,python中的字典是不排序的。您可以使用collections.OrderedDict来实现这一点。此外,要构建正确的排序,请使用指定了参数键的sort/sorted functions来按您想要的方式进行排序。

编辑后的示例:

代码语言:javascript
复制
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])
票数 13
EN

Stack Overflow用户

发布于 2012-11-23 12:46:30

希望你会发现这一点很有用。

代码语言:javascript
复制
>>> 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]
票数 5
EN

Stack Overflow用户

发布于 2012-11-23 13:02:49

在我看来,您可能需要一个从键(有序的三元组)到值(对象)的映射的无序集合。如果是这样的话,很容易从一个有序的三元组中生成一个组合键:

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

代码语言:javascript
复制
myObjects = {(10,20,30): obj0,
             (11,21,31): obj1
            }

这之所以可行,是因为tupleint都是不可变类型。

希望这能有所帮助

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13523070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档