【问题标题】:Python Create dictionary if properties are found如果找到属性,Python创建字典
【发布时间】:2014-01-17 11:34:53
【问题描述】:

我正在尝试从多个列表构建字典。问题是,如果给定列表为空,那么我不希望它包含在字典中。

这是可能的键

   '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

这是我的脚本,如果它存在于“字段”集合中,我将在其中附加键的值。

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

注意,我不希望包含空值的键...

而且我不想创建一个列表的副本,其中不包括具有空值的键...

关于如何做到这一点的任何建议?

【问题讨论】:

    标签: python dictionary key key-value


    【解决方案1】:

    在构建字典后过滤掉空列表可能是最简单的:

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

    另一种方法是在循环中构建字典,并且只在添加到列表时添加新的键值对; collections.defaultdict() instance 会更容易

    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)
    

    通过使用属性名称列表进行测试,此代码非常更简单

    【讨论】:

    • 对不起,我忘了说我不想要字典的副本。
    • @Boosted_d16:它是您刚刚构建的原始字典的浅表副本。它与你能得到的一样接近。只有 dict 对象本身被重建;键和值是完全相同的对象
    【解决方案2】:

    使用 dict-comprehension 过滤掉空键:

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

    【讨论】:

    • 对不起,我忘了说我不想要字典的副本。
    • 感谢您的时间,甚至不知道您可以编辑实际的 dict 本身,但我正在寻找 Martjin 所做的,在循环中创建 dict。再次感谢!
    【解决方案3】:

    将您的类型放入列表中。循环遍历字典和列表。大功告成!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-20
      • 2016-07-11
      • 2016-03-08
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多