【问题标题】:How to add key to dictionary by checking the value如何通过检查值将键添加到字典
【发布时间】:2021-03-20 00:02:30
【问题描述】:
  • 我需要检查'Type'是'-'还是','

  • 使用与“类型”相同的“值”创建一个新键

  • 如果 '-' 那么它的 'or'

  • 如果是 ',' 那么它的 '='

示例字典如下

{
    'RULES': {
        'rule1': {
            'Range': '0',
            'Type': '0-10'
        }
    },
    'rule2': {
        'Range': '1-10',
        'Type': '0,10',
    },
    'rule3': {
        'Range': '11-50',
        'order': '3'
    }
}

预计结束

{
   'RULES': {
       'rule1': {
           'Range': '0',
           'Type': '0-10',
           'value':'0-10',
           'operator' :'or'
       }
   },
   'rule2': {
       'Range': '1-10',
       'Type': '0,10',
       'value':'0,10',
       'operator':'='
   },
   'rule3': {
       'Range': '11-50',
       'order': '3'
   }
}

代码

for i,j in a.items():
    for k,l in j.items():
        l['value'] = l['Type']
        if '-' in l['Type']:
            l['operator'] = '='
        if ',' in l['Type']:
            l['operator'] = 'in'

得到错误 AttributeError: 'str' object has no attribute 'items'

【问题讨论】:

  • 嗯,有几种方法可以实现这一点。你在这里有什么问题吗?你有遇到什么问题吗?由于这是张贴,这是一个任务而不是一个有效的问题
  • @HansT Got error AttributeError: 'str' object has no attribute 'items'
  • Rules 1 有一个嵌套字典。
  • @jizhihaoSAMA 我把 l['value'] = l['Type'] 放在嵌套字典中
  • 在你的字典中,print(a['RULES']) 给出{ 'rule1': { 'Range': '0', 'Type': '0-10' }}。使用print(a['rule2']) 给出{ 'Range': '1-10', 'Type': '0,10', }。结构不一样。

标签: python dictionary


【解决方案1】:

代码如下:

dict1 = { 'RULES': { 'rule1': { 'Range': '0', 'Type': '0-10' }}, 'rule2': { 'Range': '1-10', 'Type': '0,10', }, 'rule3': { 'Range': '11-50', 'order': '3' } }


for i,j in dict1.items():

    for k,l in j.items():

        if 'dict' in str(type(l)):

            l['value'] = l['Type']
            if '-' in l['Type']:
                l['operator'] = '='
            if ',' in l['Type']:
                l['operator'] = 'in'


print(dict1)

【讨论】:

    【解决方案2】:

    试试这个

    d1 = {
        'RULES': {
            'rule1': { 'Range': '0', 'Type': '0-10' },
            'rule2': { 'Range': '1-10', 'Type': '0,10', },
            'rule3': { 'Range': '11-50', 'order': '3' }
        }
    }
    
    for v in d1.values():
        for y in v.values():
            if 'Type' in y.keys():
                y['value'] = y['Type']
                if '-' in y['Type']:
                    y['operator'] = 'or'
                elif ',' in y['Type']:
                    y['operator'] = '='
    print(d1)
    

    输出

    {'RULES': {'rule1': {'Range': '0', 'Type': '0-10', 'value': '0-10', 'operator': 'or'}, 'rule2': {'Range': '1-10', 'Type': '0,10', 'value': '0,10', 'operator': '='}, 'rule3': {'Range': '11-50', 'order': '3'}}}
    

    为了便于阅读,

    d1 = {
        'RULES':{
            'rule1': {
                'Range': '0', 
                'Type': '0-10', 
                'value': '0-10', 
                'operator': 'or'
            },
            'rule2': {
                'Range': '1-10', 
                'Type': '0,10', 
                'value': '0,10', 
                'operator': '='
            },
            'rule3': {
                'Range': '11-50', 
                'order': '3'
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      为了提高您的编码技能,您可能希望同时正确使用 if 语句,避免使用多个 for 语句(改用递归函数)。这将允许您避免导致问题的极端情况。

      因此,您将定义一个函数来执行您的 dict 对象的递归更新,条件是键 'Type' 必须可用。

      import re
      def update_rule(rule: dict):
          if 'Type' in rule.keys():
              if ',' in rule['Type']:
                  operator = '='
              else:
                  operator = 'or'
              rule.update({'operator': operator})
          else:
              for v in rule.values():
                  if isinstance(v, dict):
                      update_rule(v)
      

      然后,要让您更新字典,只需将该函数应用于您的输入:

      update_rule(my_input_dict)
      

      【讨论】:

        【解决方案4】:

        使用此代码:您检查是否有带有“类型”键的内部 dict,例如包含“rule1”的“规则”,如果是,则递归调用该函数。 您的错误来自您没有检查是否存在内部规则的事实。您必须在代码中处理这两种情况。

        使用此代码,您可以获得确切的预期输出:

        dict1 = {
            'RULES': {
                'rule1': {
                    'Range': '0',
                    'Type': '0-10'
                }
            },
            'rule2': {
                'Range': '1-10',
                'Type': '0,10',
            },
            'rule3': {
                'Range': '11-50',
                'order': '3'
            }
        }
        
        
        def addValue(d):
            if type(d) == type({}):
                for i,j in d.items():
                    ##print("(i, j)", i, j)
                    if type({}) == type(j):
                        if "Type" in j.keys():
                            j['value']=j['Type']
                            if '-' in j['Type']:
                                j['operator'] = 'or'
                            if ',' in j['Type']:
                                j['operator'] = '='
        
                    addValue(j)
        
        addValue(dict1)
        print(dict1)
        

        输出是:

        {'RULES': {'rule1': {'Range': '0', 'Type': '0-10', 'value': '0-10', 'operator': 'or'}}, 'rule2': {'Range': '1-10', 'Type': '0,10', 'value': '0,10', 'operator': '='}, 'rule3': {'Range': '11-50', 'order': '3'}}
        

        或者为了方便阅读:

        {'RULES':     {'rule1': {'Range': '0', 'Type': '0-10',
                                 'value': '0-10', 'operator': 'or'}},
        
         'rule2': {'Range': '1-10', 'Type': '0,10',
                     'value': '0,10', 'operator': '='},
        
         'rule3': {'Range': '11-50', 'order': '3'}
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-16
          • 2013-09-19
          • 2023-03-31
          • 2017-11-15
          相关资源
          最近更新 更多