2010-12-30 4 views
37

이것은 매우 간단하지만 꽤 평범한 방식으로하고 싶습니다. 기본적으로 사전이 있으면 특정 문자열로 시작하는 키만 포함 된 하위 딕테이션을 반환합니다.특정 문자열로 시작하는 키로 사전 썰기

» d = {'Apple': 1, 'Banana': 9, 'Carrot': 6, 'Baboon': 3, 'Duck': 8, 'Baby': 2} 
» print slice(d, 'Ba') 
{'Banana': 9, 'Baby': 2, 'Baboon': 3} 

이이 기능을 수행하는 매우 간단하다 :

def slice(sourcedict, string): 
    newdict = {} 
    for key in sourcedict.keys(): 
     if key.startswith(string): 
      newdict[key] = sourcedict[key] 
    return newdict 

을하지만 확실히 더 멋진, 영리한, 더 읽기 쉬운 해결책이? 발전기가 여기에서 도움이 될 수 있습니까? (나는 그것들을 사용할 충분한 기회가 없다).

+0

가 모호한 파이썬 코드를하지 마십시오. 파이썬의 전체 아이디어는 가독성입니다. 당신이 막연한 힘을 필요로한다면 Perl을 사용하십시오. – user3181121

+0

http://pythoncentral.io/how-to-slice-custom-objects-classes-in-python/을 보면, 자신의 타입/서브 클래스 dict에서'__getitem__'을 커스터마이즈 할 수 있습니다. – bjd2385

답변

68

이 방법에 대해 : 파이썬 2.x에서의

:

def slicedict(d, s): 
    return {k:v for k,v in d.items() if k.startswith(s)} 
+3

내장 된'slice '를 그림자 처리하지 마십시오 (거의 아무도 사용하지 않지만). –

+0

그 독해력은 맛있습니다. 그리고'슬라이스 '가 내장인지 전혀 몰랐습니다. – Aphex

+3

@Ignacio : 당신이 작고 지역적인 기능을 할 때, 너무 자주 내장 된 이름을 사용하는 것은 너무 많습니다. 중요하지 않은 기능 (있는 경우)과 전역에 대해 걱정할 필요가 없습니다. 결국 Builtins는 키워드가 아닙니다. –

9

기능적인 스타일에서 :

dict(filter(lambda item: item[0].startswith(string),sourcedict.iteritems()))

+8

파이썬에서 기능적 스타일은 일반적으로 원하지 않는 것입니다. –

+13

Eh? dict-comprehension 접근법은 확실히 "기능적 스타일"에 대한 나의 정의에 속합니다. –

3
파이썬 3.x의에서

def slicedict(d, s): 
    return {k:v for k,v in d.iteritems() if k.startswith(s)} 

0 대신사용 items() : 그것은이 가능해서

def slicedict(d, s): 
    return {k:v for k,v in d.items() if k.startswith(s)} 
관련 문제