![](/img/trans.png)
[英]checking a word in a text and if it matched a dictionary key add to the value of that key
[英]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.