2014-01-17 4 views
0

여러 목록에서 사전을 만들려고합니다. 문제는, 주어진리스트가 비어 있다면, 나는 그것을 dict에 포함하고 싶지 않다는 것입니다.Python 속성을 찾으면 사전 만들기

을 Heres 가능한 키

'required', 
    'as_banner', 
    'min', 
    'chart_layout', 
    'client_name', 
    'filter_text', 
    'sort_order', 
    'chart_type', 
    'chart_color', 
    'position', 
    'order' 

을 heres DICT를 구축하는 나의 방법 :

propertyDict = dict() 
propertyDict["required"] = requiredtype 
propertyDict["as_banner"] = as_bannertype 
propertyDict["min"] = mintype 
propertyDict["chart_layout"] = chart_layouttype 
propertyDict["client_name"] = clientnametype 
propertyDict["filter_text"] = filter_texttype 
propertyDict["sort_order"] = sort_ordertype 
propertyDict["chart_type"] = charttype 
propertyDict["chart_color"] = chart_colortype 
propertyDict["position"] = positiontype 
propertyDict["order"] = ordertype 

을 Heres는 "필드"에있는 경우 내가 키의 값을 추가하는 내 스크립트 모음 .

...

{'as_banner': [], 'chart_color': ['green', 'pink', 'green', 'green', 'green', 'orange', 'yellow', 'white'], 'chart_layout': ['1', '2', '3', '4', '5', '6', '7', '8'], 'sort_order': ['asending', 'desending', 'asending', 'desending', 'asending', 'asending', 'asending', 'desending'], 'chart_type': ['bar', 'WeightedBar', 'column', 'pie', 'line', 'column', 'line', 'pie'], 'client_name': ['Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)'], 'filter_text': [], 'required': [], 'position': [], 'min': [], 'order': []} 

참고, 내가 포함 빈 값으로 키를 돼요 그리고 난의 사본을 만들려면 그나마 :

for table in mtd_tom.Tables: 
    if not is_profile_table(table, type="mtd"): 
     if table.Description == "Sport Parents (Regrouped)": 
      for i, subaxis in enumerate(table.Axes['Side'].SubAxes): 
       nField = shatter_sae(subaxis.Specification)['varName'] 
       field = mdd.Fields[nField] 

       if field.Properties.Item['required']: 
        requiredtype.append(field.Properties.Item['required']) 
       if field.Properties.Item['as_banner']: 
        as_bannertype.append(field.Properties.Item['as_banner']) 
       if field.Properties.Item['min']: 
        mintype.append(field.Properties.Item['min']) 
       if field.Properties.Item['chart_layout']: 
        chart_layouttype.append(field.Properties.Item['chart_layout']) 
       if field.Properties.Item['client_name']: 
        clientnametype.append(field.Properties.Item['client_name']) 
       if field.Properties.Item['filter_text']: 
        filter_texttype.append(field.Properties.Item['filter_text']) 
       if field.Properties.Item['sort_order']: 
        sort_ordertype.append(field.Properties.Item['sort_order']) 
       if field.Properties.Item['chart_type']:     
        charttype.append(field.Properties.Item['chart_type']) 
       if field.Properties.Item['chart_color']: 
        chart_colortype.append(field.Properties.Item['chart_color']) 
       if field.Properties.Item['position']: 
        positiontype.append(field.Properties.Item['position']) 
       if field.Properties.Item['order']: 
        ordertype.append(field.Properties.Item['order'])       
       else: 
        print "%s not found" % properties[i] 

는 Heres는 지금의 출력으로 값이 비어있는 키를 제외하는 목록 ...

어떻게해야합니까?

답변

4

아마도 빈 목록을 필터링하는 것이 가장 쉽습니다. 따고이 사전을 구축 :

propertyDict = {k: v for k, v in propertyDict.iteritems() if v} 

대안은 루프에서 사전을 구축하고, 목록에 추가 할 경우에만 새로운 키 - 값 쌍을 추가하는 것입니다; collections.defaultdict() instance이 코드는 목록에서 유형을 넣어뿐만 아니라

+0

미안 나는 그 dict의 사본을 원하지 않는다는 것을 잊었다. –

+1

@ Boosted_d16 : 방금 작성한 원본 dict의 복사본입니다. 그것은 당신이 얻을 수있는 것과 거의 같은 것입니다. dict 객체 자체 만 재 구축됩니다. 키와 값은 똑같은 객체 *입니다. –

+0

이것은 불량입니다 !! –

2

사전인가-이해를 사용하여 빈 키를 필터링 : Python2.6를 들어

>>> d = {'as_banner': [], 'chart_color': ['green', 'pink', 'green', 'green', 'green', 'orange', 'yellow', 'white'], 'chart_layout': ['1', '2', '3', '4', '5', '6', '7', '8'], 'sort_order': ['asending', 'desending', 'asending', 'desending', 'asending', 'asending', 'asending', 'desending'], 'chart_type': ['bar', 'WeightedBar', 'column', 'pie', 'line', 'column', 'line', 'pie'], 'client_name': ['Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)'], 'filter_text': [], 'required': [], 'position': [], 'min': [], 'order': []} 
>>> {k:v for k, v in d.iteritems() if v} 
{'chart_layout': ['1', '2', '3', '4', '5', '6', '7', '8'], 'client_name': ['Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)'], 'chart_color': ['green', 'pink', 'green', 'green', 'green', 'orange', 'yellow', 'white'], 'sort_order': ['asending', 'desending', 'asending', 'desending', 'asending', 'asending', 'asending', 'desending'], 'chart_type': ['bar', 'WeightedBar', 'column', 'pie', 'line', 'column', 'line', 'pie']} 

및 이전 버전을 사용하십시오

dict(((k, v) for k, v in d.iteritems() if v)) 

원래 DICT 자체가 비어와 키에 del를 사용하여 업데이트하려면를 값 :

>>> for k, v in d.items(): 
    if not v: 
     del d[k] 

>>> d 
{'chart_layout': ['1', '2', '3', '4', '5', '6', '7', '8'], 'chart_color': ['green', 'pink', 'green', 'green', 'green', 'orange', 'yellow', 'white'], 'chart_type': ['bar', 'WeightedBar', 'column', 'pie', 'line', 'column', 'line', 'pie'], 'client_name': ['Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)', 'Sport Parents (Regrouped)'], 'sort_order': ['asending', 'desending', 'asending', 'desending', 'asending', 'asending', 'asending', 'desending']} 
+0

미안하지만 나는 그 dict 사본을 원한다는 것을 잊어 버렸다. –

+0

@ Boosted_d16 업데이트 된 솔루션을 확인하십시오. –

+0

시간 내 주셔서 감사합니다. 실제로 dict 자체를 편집 할 수는 없지만 Martjin이 한 일을 찾아 루프에서 dict을 작성해 주셨습니다. 다시 한 번 감사드립니다! –

0

를 테스트하는 속성 이름의 목록을 사용하여 크게 간단 입니다

from collections import defaultdict 

propertyDict = defaultdict(list) 
properties = ('required', 'as_banner', 'min', 'chart_layout', 'client_name', 
       'filter_text', 'sort_order', 'chart_type', 'chart_color', 
       'position', 'order') 

for i, subaxis in enumerate(table.Axes['Side'].SubAxes): 
    nField = shatter_sae(subaxis.Specification)['varName'] 
    field = mdd.Fields[nField] 
    for prop in properties: 
     value = field.Properties.Item[prop] 
     if value: 
      propertyDict[prop].append(value) 

# optional, turn `defaultdict` back into a `dict` object. This step is really 
# not needed unless you need the `defaultdict.__missing__` behaviour to cease for 
# later code. 
# propertyDict = dict(propertyDict) 

훨씬 쉽게 만들 것입니다. dict과 목록을 반복하십시오. 끝났어!

types = [requiredtype, as_bannertype, ..] 
for k, v in propertyDict.items(): 
    for t in types: 
     if v: 
      t.append(v)