我要做的是将一个键中的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
答案 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.x
,pos.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
为密钥存储多个值的另一种方法是使用容器类型,例如list
,set
或tuple
。
答案 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
只是一个建议。