Python中字典中键的多个值

时间:2010-09-04 23:38:18

标签: python dictionary

我要做的是将一个键中的3个值转换为单独的变量。目前我这样做:

for key in names:
   posX = names[key][0]
   posY = names[key][1]
   posZ = names[key][2]

这对我来说似乎不太直观,即使它有效。我也尝试过这样做:

for key, value in names:
   location = value

不幸的是,这给了我一个单独的对象(这是我的预期),但我需要分配给键的各个值。感谢并为我对Python的新见道歉。

更新 抱歉没有说明我从哪里获取我的价值观。以下是我为第一个例子做的事情。

names = {}

for name in objectNames:
    cmds.select(name)
    location = cmds.xform(q=True, ws=True, t=True)
    names[name] = location

3 个答案:

答案 0 :(得分:11)

这根本不是不直观的。

为字典中的给定键存储“多个值”的唯一方法是将某种容器对象存储为值,例如列表或元组。您可以通过下标来访问列表或元组,就像在第一个示例中一样。

您的示例唯一的问题是,当以这种方式使用时,访问此类容器是一种丑陋且不方便的方式。试试这样,你可能会更开心:

>>> alist = [1, 2, 3]
>>> one, two, three = alist
>>> one
1
>>> two
2
>>> three
3
>>> 

因此,您的第二个例子可能是:

for key, value in names.items():
    posX, posY, posZ = value

正如FabienAndre在下面的评论中指出的那样,我还完全忘记了更方便的语法,for key,(posX,posY,posZ) in names.items():

您没有指定从哪里获取这些值,但是如果它们来自您可以控制的代码,并且您可以依赖于使用Python 2.6或更高版本,那么您也可以查看{{3} }。然后你可以提供一个命名元组作为dict值,并使用语法pos.xpos.y等来访问值:

for name, pos in names.items():
    doSomethingWith(pos.x)
    doSomethingElseWith(pos.x, pos.y, pos.z)

答案 1 :(得分:2)

如果您不介意外部依赖,可以包括Werkzeug's MultiDict

  

MultiDict是一个字典子类,可以自定义处理同一个键的多个值,例如包装器中的解析函数使用它们。

>>> d = MultiDict([('a', 'b'), ('a', 'c')])
>>> d
MultiDict([('a', 'b'), ('a', 'c')])
>>> d['a']
'b'
>>> d.getlist('a')
['b', 'c']
>>> 'a' in d
True

为密钥存储多个值的另一种方法是使用容器类型,例如listsettuple

答案 2 :(得分:2)

查看代码,使用位置/位置变量,您还可以将X,Y和Z位置统一为公共类型,例如使用命名元组:

from collections import namedtuple

Position = namedtuple("Position", "x, y, z")

locations = {
    "chair": Position(1, 2, 5.3),
    "table": Position(5, 3.732, 6),
    "lamp": Position(4.4, 7.2, 2)
}

print "Chair X location: ", locations["chair"].x

只是一个建议。