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)