2012-02-18 2 views
5

에서 특정 키 - 값 쌍을 포함하는 파이썬 사전을 만들어이 같은 형태의 일부 코드가 있습니다다른 사전

d = {'foo': True, 'bar': 42, 'baz': '!'} 

a = {'foo': d['foo'], 'bar': d['bar']} 
b = {'foo': d['foo'], 'baz': d['baz']} 
c = {'bar': d['bar'], 'baz': d['baz']} 

는 확실히이 표현하는 더 나은 방법이 있습니다. 나는이 목적을 위해 기능을 쓸 수

# I'd hoped that something like this would work... 
a = d.copy('foo', 'bar') 
b = d.copy('foo', 'baz') 
c = d.copy('bar', 'baz') 

:

copydict = lambda dct, *keys: {key: dct[key] for key in keys} 

a = copydict(d, 'foo', 'bar') 
b = copydict(d, 'foo', 'baz') 
c = copydict(d, 'bar', 'baz') 

이 더 나은가요 사실은 사전의 copy 방법은 새 사전에 포함 할 키를 받아 희망의 문서를 읽어 솔루션보다 위의?

+0

왜 a, b, c에 대한 목록 (또는 집합)을 사용하지 않으시겠습니까? 당신이 필요로 할 때 d에서 값을 차가운 모습으로 보아라. – maxy

+0

사실 장고의'urlencode' 함수 ('urllib.urlencode'와 같이 사전을 허용)에'a','b','c'를 실제로 전달하고 있습니다. – davidchambers

+0

@BlaXpirit : "아니오"라는 대답을 작성해야합니다. (HTML 코멘트가있는 최소 크기의 패드). 그래서 우리 모두는 그것을 열렬히 투표 할 수있다. –

답변

5

질문에있는 함수가 최상의 솔루션이라고 생각합니다.

물론 누군가가 관용적 인 코드를 게시 할 수도 있지만 더 좋게/더 빨리 작동하지 않을 것이라고 확신합니다. 목록을 반복하고 키로 dict에서 항목을 가져 오는 것은 얻을 수있는만큼 빠릅니다.

하나의 제안은 keys 매개 변수에서 별을 제거하는 것입니다. 인수 unpacking은 불필요한 오버 헤드를 추가합니다. 해당 키를 터플로 전달하는 데 아무런 문제가 없어야합니다.

@BlaXpirit에 의해 지적
0

,이 솔루션은 아마 속도와 가독성의 측면에서 당신보다 더 나은 될 수 없습니다,하지만 당신은 이런 식으로 뭔가를 할 수 :

>>> from operator import itemgetter 
>>> d = {'foo': True, 'bar': 42, 'baz': '!'} 
>>> keys = ['foo', 'bar'] 
>>> dict(zip(keys, itemgetter(*keys)(d))) 
{'bar': 42, 'foo': True} 
3

나는 것 유일한 개선 수 있도록 실제 함수 정의를 사용하는 것입니다하지 람다 :

def copy_dict(d, *keys): 
    """Make a copy of only the `keys` from dictionary `d`.""" 
    return {key: d[key] for key in keys} 

키 누락 처리하는 것이 유용 할 수 있지만, 수도, 그래서 파이썬이 당신이 멋지게 * 인수와 선택적 키워드 인수를 혼합 할 수 없습니다 튜플 인수로 가야합니다 :

def copy_dict(d, keys, default=None): 
    """Make a copy of only the `keys` from dictionary `d`. 

    Use `default` if a key is missing. 

    """ 
    return {key: d.get(key, default) for key in keys}