Python中键入字典的多个值

2024-05-23 15:04:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我要做的是将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

Tags: 对象keynameintruefornamesvalue
3条回答

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

A MultiDict is a dictionary subclass customized to deal with multiple values for the same key which is for example used by the parsing functions in the wrappers.

>>> 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

这一点也不不奇怪。

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

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

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

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

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

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

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

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

查看代码,使用位置/位置变量,还可以将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

不过,只是个建议。

相关问题 更多 >