Присвоение дикту - PullRequest
       4

Присвоение дикту

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

Простите, если об этом уже спрашивали. Я не знал, как его искать.

Я хорошо знаком со следующей идиомой:

def foo():
    return [1,2,3]

[a,b,c] = foo()
(d,e,f) = foo()

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

Я также знаю, что вы можете сделать

def bar():
    return {'a':1,'b':2,'c':3}

(one, two, three) = bar()
[four, five, six] = bar()

где ключи, возвращаемые с правой стороны, будут назначены контейнерам с левой стороны.

Однако, мне любопытно, есть ли способ сделать следующее в Python 2.6 или более ранней версии:

{letterA:one, letterB:two, letterC:three} = bar()

и работает ли он так же, как работает от последовательностей к последовательностям? Если нет, то почему? Наивно пытаться сделать это так, как я написал, не получится.

Ответы [ 3 ]

4 голосов
/ 29 сентября 2010

Элементы словаря не имеют порядка, поэтому пока это работает:

>>> def bar():
...     return dict(a=1,b=2,c=3)
>>> bar()
{'a': 1, 'c': 3, 'b': 2}
>>> (lettera,one),(letterb,two),(letterc,three) = bar().items()
>>> lettera,one,letterb,two,letterc,three
('a', 1, 'c', 3, 'b', 2)

Вы можете видеть, что вы не можете предсказать, как будут назначены переменные.Вы можете использовать collections.OrderedDict в Python 3 для управления этим.

1 голос
/ 29 сентября 2010

Если вы измените bar () так, чтобы он возвращал dict (как предложено @mikerobi), вы можете сохранить ключевые элементы, которые есть в вашем существующем dict.В этом случае используйте update:

mydict = {}
mydict['existing_key'] = 100

def bar_that_says_dict():
    return { 'new_key': 101 }

mydict.update(bar_that_says_dict())

print mydict

. Это должно привести к выводу dict как с current_key, так и с new_key.Если бы mydict имел ключ new_key, обновление обновило бы его значением, возвращенным из bar_that_says_dict.

0 голосов
/ 29 сентября 2010

Нет, если вы не можете изменить функцию бара, вы можете довольно легко создать dict из вывода.

Это наиболее компактное решение.Но я бы предпочел изменить функцию bar, чтобы она возвращала dict.

dict(zip(['one', 'two', 'three'], bar()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...