簡體   English   中英

如果鍵值為空,則使用 python 添加字典

[英]Add dictionary if key value is empty using python

我有一個缺少值的字典(鍵在那里,但關聯的值為空)。 例如我想要下面的字典:

dct = {'ID': '', 'gender': 'male', 'age': '20', 'weight': '', 'height': '5.7'}

改為這種形式:

dct = {'ID': {'link': '','value': ''}, 'gender': 'male', 'age': '20', 'weight': {'link': '','value': ''}, 'height': '5.7'}

我希望 ID 和 Weight 鍵如果為空則應替換為嵌套字典。

我怎樣才能以最省時的方式編寫它?

我嘗試了以下鏈接的解決方案,但沒有用,

def update(orignal, addition):
    for k, v in addition.items():
        if k not in orignal:
            orignal[k] = v
        else:
            if isinstance(v, dict):
                update(orignal[k], v)
            elif isinstance(v, list):
                for i in range(len(v)):
                    update(orignal[k][i], v[i])
            else:
                if not orignal[k]:
                    orignal[k] = v

錯誤:TypeError: 'str' object 不支持項目分配

通過比較 python 中的示例 json 來填充缺失的鍵

在 Python 的字典中添加缺失的鍵

您可以遍歷列表並查看該值是否為空字符串(''),如果是,則將其替換為默認值。 這是一個小片段 -

dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}

def update(d, default):
    for k, v in d.items():
        if v == '':
            d[k] = default.copy()

update(dct, {'link':'','value':''})
print(dct)

Output:

{'ID': {'link': '', 'value': ''}, 'gender': 'male', 'age': '20', 'weight': {'link': '', 'value': ''}, 'height': '5.7'}

請注意,字典是通過引用 function 傳遞的,因此在那里所做的任何更新都將反映在原始字典中,如上例所示。


如果您的字典是嵌套的,並且您也希望對嵌套項進行替換,那么您可以使用此 function -

def nested_update(d, default):
    for k, v in d.items():
        if v == '':
            d[k] = default.copy()
        if isinstance(v, list):
            for item in v:
                nested_update(item, default)
        if isinstance(v, dict):
            nested_update(v, default)

這是一個包含字典列表和嵌套字典的小例子 -

dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7', "list_data":[{'empty': ''}, {'non-empty': 'value'}], "nested_dict": {"key1": "val1", "missing_nested": ""}}
nested_update(dct, {'key1': 'val1-added', 'key2': 'val2-added'})
print(dct)

Output:

{'ID': {'key1': 'val1-added', 'key2': 'val2-added'}, 'gender': 'male', 'age': '20', 'weight': {'key1': 'val1-added', 'key2': 'val2-added'}, 'height': '5.7', 'list_data': [{'empty': {'key1': 'val1-added', 'key2': 'val2-added'}}, {'non-empty': 'value'}], 'nested_dict': {'key1': 'val1', 'missing_nested': {'key1': 'val1-added', 'key2': 'val2-added'}}}

對於“此默認字典僅指定 ID 和 Weight 之類的鍵而不是其他鍵” ,您可以更新我們替換值時的條件 -

def nested_update(d, default):
    for k, v in d.items():
        if k in ('ID', 'weight') and v == '':
            d[k] = default.copy()
        if isinstance(v, list):
            for item in v:
                nested_update(item, default)
        if isinstance(v, dict):
            nested_update(v, default)

這個問題似乎很相似https://stackoverflow.com/a/3233356/6396981

import collections.abc

def update(d, u):
    for k, v in u.items():
        if isinstance(v, collections.abc.Mapping):
            d[k] = update(d.get(k, {}) or {}, v)
        else:
            d[k] = v
    return d

例如在你的情況下:

>>> dict1 = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
>>> dict2 = {'ID': {'link':'','value':''}, 'weight': {'link':'','value':''}}
>>>
>>> update(dict1, dict2)
{'ID': {'link': '', 'value': ''}, 'gender': 'male', 'age': '20', 'weight': {'link': '', 'value': ''}, 'height': '5.7'}
>>>

暫無
暫無

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

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