[python] 해체 결합 딕셔너리 콘텐츠

사전을 ‘구조화’하고 키 뒤에 값을 변수 이름과 연결하려고합니다. 같은 것

params = {'a':1,'b':2}
a,b = params.values()

사전 주문한되지 않기 때문에 그러나, 보장은 없습니다 params.values()순으로 값을 반환은 (a, b). 이 작업을 수행하는 좋은 방법이 있습니까?



답변

지역 사전 사용과 관련된 문제가 두렵고 원래 전략을 따르는 것을 선호하는 경우 python 2.7 및 3.1 컬렉션의 Ordered Dictionaries. OrderedDicts를 사용하면 처음 삽입 된 순서대로 사전 항목을 복구 할 수 있습니다.


답변

from operator import itemgetter

params = {'a': 1, 'b': 2}

a, b = itemgetter('a', 'b')(params)

정교한 람다 함수 또는 사전 이해 대신 내장 라이브러리를 사용할 수 있습니다.


답변

Jochen의 제안보다 덜 반복하여이를 수행하는 한 가지 방법은 도우미 기능을 사용하는 것입니다. 이렇게하면 순서에 관계없이 변수 이름을 나열하고 dict에있는 항목의 하위 집합 만 구조화 할 수있는 유연성이 제공됩니다.

pluck = lambda dict, *args: (dict[arg] for arg in args)

things = {'blah': 'bleh', 'foo': 'bar'}
foo, blah = pluck(things, 'foo', 'blah')

또한 joaquin의 OrderedDict 대신 키를 정렬하고 값을 가져올 수 있습니다. 유일한 문제는 변수 이름을 알파벳 순서로 지정하고 dict의 모든 것을 구조화해야한다는 것입니다.

sorted_vals = lambda dict: (t[1] for t in sorted(dict.items()))

things = {'foo': 'bar', 'blah': 'bleh'}
blah, foo = sorted_vals(things)


답변

파이썬은 딕셔너리가 아닌 시퀀스 만 “해체”할 수 있습니다. 따라서 원하는 것을 작성하려면 필요한 항목을 적절한 시퀀스에 매핑해야합니다. 나 자신이 찾을 수있는 가장 가까운 매치는 (그다지 섹시하지 않음) :

a,b = [d[k] for k in ('a','b')]

이것은 생성기에서도 작동합니다.

a,b = (d[k] for k in ('a','b'))

다음은 전체 예입니다.

>>> d = dict(a=1,b=2,c=3)
>>> d
{'a': 1, 'c': 3, 'b': 2}
>>> a, b = [d[k] for k in ('a','b')]
>>> a
1
>>> b
2
>>> a, b = (d[k] for k in ('a','b'))
>>> a
1
>>> b
2


답변

정말 이렇게하고 싶나요?

def some_func(a, b):
  print a,b

params = {'a':1,'b':2}

some_func(**params) # equiv to some_func(a=1, b=2)


답변

다음 은 JS에서 구조 분해 할당이 작동 하는 방식과 유사하게 수행하는 또 다른 방법입니다 .

params = {'b': 2, 'a': 1}
a, b, rest = (lambda a, b, **rest: (a, b, rest))(**params)

우리가 한 일은 params 사전을 키 값으로 압축 해제하는 것이 었습니다 (** 사용) ( Jochen의 대답 과 같이 ), 그런 다음 람다 서명에서 해당 값을 가져와 키 이름에 따라 할당했습니다. 여기에 보너스가 있습니다. 또한 람다 서명에 없는 사전을 가져 오므로 다음과 같은 경우 :

params = {'b': 2, 'a': 1, 'c': 3}
a, b, rest = (lambda a, b, **rest: (a, b, rest))(**params)

람다가 적용된 후 나머지 변수는 이제 다음을 포함합니다. { ‘c’: 3}

사전에서 불필요한 키를 생략하는 데 유용합니다.

도움이 되었기를 바랍니다.


답변

이 시도

d = {'a':'Apple', 'b':'Banana','c':'Carrot'}
a,b,c = [d[k] for k in ('a', 'b','c')]

결과:

a == 'Apple'
b == 'Banana'
c == 'Carrot'