[python] 파이썬 사전에서 값에 대한 매핑

사전을 감안할 때 { k1: v1, k2: v2 ... }내가 얻을 싶어 { k1: f(v1), k2: f(v2) ... }내가 함수를 통과 제공을 f.

그러한 내장 기능이 있습니까? 아니면해야합니까

dict([(k, f(v)) for (k, v) in my_dictionary.iteritems()])

이상적으로 나는 단지 쓸 것입니다

my_dictionary.map_values(f)

또는

my_dictionary.mutate_values_with(f)

즉, 원래 사전이 변경되거나 사본이 생성되면 중요하지 않습니다.



답변

그러한 기능은 없습니다. 가장 쉬운 방법은 dict comprehension을 사용하는 것입니다.

my_dictionary = {k: f(v) for k, v in my_dictionary.items()}

Python 2.7에서는 메모리를 저장 .iteritems()하는 대신 메소드를 사용하십시오 .items(). dict comprehension 구문은 Python 2.7까지 도입되지 않았습니다.

목록에는 그러한 방법이 없습니다. 리스트 이해력이나 map()기능 을 사용해야 합니다.

map()따라서이 함수를 사용 하여 받아쓰기를 처리 할 수도 있습니다 .

my_dictionary = dict(map(lambda kv: (kv[0], f(kv[1])), my_dictionary.iteritems()))

그러나 그것은 실제로 읽을 수있는 것은 아닙니다.


답변

이 툴즈는 이러한 종류의 단순하면서도 반복적 인 로직에 적합합니다.

http://toolz.readthedocs.org/en/latest/api.html#toolz.dicttoolz.valmap

당신이 원하는 곳으로 바로 당신을 가져옵니다.

import toolz
def f(x):
  return x+1

toolz.valmap(f, my_list)


답변

새로운 사전을 작성하는 대신이 작업을 제자리에서 수행 할 수 있습니다 (사전이 필요없는 경우).

def mutate_dict(f,d):
    for k, v in d.iteritems():
        d[k] = f(v)

my_dictionary = {'a':1, 'b':2}
mutate_dict(lambda x: x+1, my_dictionary)

다음을 my_dictionary포함하는 결과 :

{'a': 2, 'b': 3}


답변

인해 PEP-0469 항목에 iteritems을 () 이름 () 및 PEP-3113 제거 풀고 매개 변수 튜플을 , 파이썬으로 작성해야 3.X 마티 피에 터스 ♦ 대답을 다음과 같이 :

my_dictionary = dict(map(lambda item: (item[0], f(item[1])), my_dictionary.items()))


답변

내 원래의 대답은 ( defaultdict 공장의 액세스 키에 대한 솔루션 으로이 문제를 해결하려고 노력하면서) 요점을 놓쳤지만 현재 질문에 대한 실제 솔루션을 제안하기 위해 재 작업했습니다.

여기있어:

class walkableDict(dict):
  def walk(self, callback):
    try:
      for key in self:
        self[key] = callback(self[key])
    except TypeError:
      return False
    return True

용법:

>>> d = walkableDict({ k1: v1, k2: v2 ... })
>>> d.walk(f)

아이디어는 원하는 기능을 제공하기 위해 원래 dict을 서브 클래 싱하는 것입니다. 모든 값에 대해 함수를 “매핑”합니다.

장점은이 사전을 사용하여 원본 데이터를 마치 마치 dict콜백으로 요청시 데이터를 변환 하는 것처럼 원래 데이터를 저장하는 데 사용할 수 있다는 것 입니다.

물론 클래스와 함수의 이름을 원하는대로 자유롭게 지정할 수 있습니다 (이 답변에서 선택한 이름은 PHP의 array_walk()함수에서 영감을 얻었습니다 ).

참고 : 둘 다 tryexcept블록이나 return문이 기능을위한 필수, 그들은 PHP의 더 모방 행동에있다 array_walk.


답변

람다 내부에서 색인을 생성하지 않으려면 다음과 같이하십시오.

rval = dict(map(lambda kv : (kv[0], ' '.join(kv[1])), rval.iteritems()))

당신은 또한 할 수 있습니다 :

rval = dict(map(lambda(k,v) : (k, ' '.join(v)), rval.iteritems()))


답변

이 유스 케이스에 합류했습니다. 나는 gens ‘s answer을 구현 하여 dicts 값을 처리하기위한 재귀 적 접근 방식을 추가했습니다.

def mutate_dict_in_place(f, d):
    for k, v in d.iteritems():
        if isinstance(v, dict):
            mutate_dict_in_place(f, v)
        else:
            d[k] = f(v)

# Exemple handy usage
def utf8_everywhere(d):
    mutate_dict_in_place((
        lambda value:
            value.decode('utf-8')
            if isinstance(value, bytes)
            else value
        ),
        d
    )

my_dict = {'a': b'byte1', 'b': {'c': b'byte2', 'd': b'byte3'}}
utf8_everywhere(my_dict)
print(my_dict)

파이썬 2에서 문자열을 바이트로 인코딩하는 json 또는 yaml 파일을 처리 할 때 유용 할 수 있습니다