Несколько значений для ключа в словаре в Python - PullRequest
7 голосов
/ 05 сентября 2010

Я пытаюсь получить 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 ]

11 голосов
/ 05 сентября 2010

Это совсем не интуитивно понятно.

Единственный способ сохранить «несколько значений» для данного ключа в словаре - это сохранить в качестве значения некоторый объект-контейнер, такой как список или кортеж.Вы можете получить доступ к списку или кортежу, подписавшись на него, как и в первом примере.

Единственная проблема в вашем примере - это то, что это уродливый и неудобный способ доступа к такому контейнеру, когда он используется в этомпуть.Попробуйте это так, и вы, вероятно, будете намного счастливее:

>>> 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 или новее, вы также можете заглянуть в именованные кортежи .Затем вы можете указать именованный кортеж в качестве значения dict и использовать синтаксис pos.x, pos.y и т. Д. Для доступа к значениям:

for name, pos in names.items():
    doSomethingWith(pos.x)
    doSomethingElseWith(pos.x, pos.y, pos.z)
2 голосов
/ 05 сентября 2010

Глядя на ваш код, работая с переменными позиции / местоположения, вы также можете объединить позиции 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

Только предложение.

2 голосов
/ 05 сентября 2010

Если вы не возражаете против внешней зависимости, вы можете включить MultiDict Werkzeug :

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...