Python Создать словарь, если свойства найдены

Я пытаюсь построить словарь из нескольких списков. Проблема в том, что если данный список пуст, то я не хочу, чтобы он был включен в dict.

Вот возможные ключи

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

вот мой метод построения диктата:

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

Вот мой скрипт, в котором я добавляю значения ключа, если он существует в коллекции "field".

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]

Вот вывод на данный момент:

{'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': []}

Обратите внимание, я не хочу, чтобы ключи с пустыми значениями были включены...

И я не хочу создавать копию списка, который исключает ключи с пустыми значениями...

Кто-нибудь предложил, как это сделать?

3 ответа

Решение

Вероятно, проще всего отфильтровать пустые списки после создания словаря:

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

Альтернативой может быть создание вашего словаря в цикле и добавление новой пары ключ-значение только при добавлении в список; collections.defaultdict() экземпляр сделает это намного проще

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-понимание:

>>> 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']}

Для Python2.6 и более ранних версий используйте:

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

Для обновления самого оригинального дикта используйте 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']}

Поместите ваши типы в список. Переберите диктовку и список. Вы сделали!

types = [requiredtype, as_bannertype, ..]
for k, v in propertyDict.items():
    for t in types:
        if v:
            t.append(v)
Другие вопросы по тегам