簡體   English   中英

如何通過檢查值將鍵添加到字典

[英]How to add key to dictionary by checking the value

  • 我需要檢查“類型”是“-”還是“,”

  • 使用與“類型”相同的“值”創建一個新鍵

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

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

示例字典如下

{
    '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'

這是如下代碼:

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)

嘗試這個

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)

Output

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

為了提高您的編碼技能,您可能希望同時使用 if 語句,避免使用多個 for 語句(改用遞歸 function)。 這將允許您避免導致問題的極端情況。

因此,您將定義一個函數來執行您的字典 object 的遞歸更新,條件是鍵“類型”必須可用。

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)

然后,為了讓您更新字典,只需將 function 應用於您的輸入:

update_rule(my_input_dict)

使用此代碼:您檢查是否有帶有“類型”鍵的內部字典,例如包含“rule1”的“規則”,如果是這種情況,則遞歸調用 function。 您的錯誤來自您沒有檢查是否存在內部規則的事實。 您必須在代碼中處理這兩種情況。

使用此代碼,您可以獲得確切的預期 output:

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)

Output 是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM