在 python 字典中替换 None
Replace None in a python dictionary
我碰巧有一本复杂的字典(有列表、列表中的字典等)。某些键的值设置为 None
有什么办法可以用我自己的一些默认值替换这个 None 而不管字典的复杂结构?
for k, v in my_dict.items():
if v is None:
my_dict[k] = "my default value"
您可以使用 json
模块中的 object_pairs_hook
来完成:
def dict_clean(items):
result = {}
for key, value in items:
if value is None:
value = 'default'
result[key] = value
return result
dict_str = json.dumps(my_dict)
my_dict = json.loads(dict_str, object_pairs_hook=dict_clean)
来自 Lutz 的递归解决方案:
def replace(any_dict):
for k, v in any_dict.items():
if v is None:
any_dict[k] = "my default value"
elif type(v) == type(any_dict):
replace(v)
replace(my_dict)
您可以使用遍历所有字典和列表的递归函数来实现:
def convert(obj):
if type(obj) == list:
for x in obj:
convert(x)
elif type(obj) == dict:
for k, v in obj.iteritems():
if v is None:
obj[k] = 'DEFAULT'
else:
convert(v)
data = {1: 'foo', 2: None, 3: [{1: 'foo', 2: None}]}
convert(data)
print data # -> {1: 'foo', 2: 'DEFAULT', 3: [{1: 'foo', 2: 'DEFAULT'}]}
这是一个递归解决方案,它也替换了列表中的 None
s。
首先我们定义一个简单的class,Null
来替代None
.
class Null(object):
def __repr__(self):
return 'Null'
NULL = Null()
def replace_none(data):
for k, v in data.items() if isinstance(data, dict) else enumerate(data):
if v is None:
data[k] = NULL
elif isinstance(v, (dict, list)):
replace_none(v)
# Test
data = {
1: 'one',
2: ['two', 2, None],
3: None,
4: {4: None, 44: 'four'},
5: {
5: [55, 56, None],
6: {66: None, 67: None},
8: [88, {9:'nine', 99:None}, 100]
}
}
print(data)
replace_none(data)
print(data)
输出
{1: 'one', 2: ['two', 2, None], 3: None, 4: {44: 'four', 4: None}, 5: {8: [88, {9: 'nine', 99: None}, 100], 5: [55, 56, None], 6: {66: None, 67: None}}}
{1: 'one', 2: ['two', 2, Null], 3: Null, 4: {44: 'four', 4: Null}, 5: {8: [88, {9: 'nine', 99: Null}, 100], 5: [55, 56, Null], 6: {66: Null, 67: Null}}}
# replace_none_with_empty_str_in_dict.py
raw = {'place': 'coffee shop', 'time': 'noon', 'day': None}
def replace_none_with_empty_str(some_dict):
return { k: ('' if v is None else v) for k, v in some_dict.items() }
print(replace_none_with_empty_str(raw))
我碰巧有一本复杂的字典(有列表、列表中的字典等)。某些键的值设置为 None
有什么办法可以用我自己的一些默认值替换这个 None 而不管字典的复杂结构?
for k, v in my_dict.items():
if v is None:
my_dict[k] = "my default value"
您可以使用 json
模块中的 object_pairs_hook
来完成:
def dict_clean(items):
result = {}
for key, value in items:
if value is None:
value = 'default'
result[key] = value
return result
dict_str = json.dumps(my_dict)
my_dict = json.loads(dict_str, object_pairs_hook=dict_clean)
来自 Lutz 的递归解决方案:
def replace(any_dict):
for k, v in any_dict.items():
if v is None:
any_dict[k] = "my default value"
elif type(v) == type(any_dict):
replace(v)
replace(my_dict)
您可以使用遍历所有字典和列表的递归函数来实现:
def convert(obj):
if type(obj) == list:
for x in obj:
convert(x)
elif type(obj) == dict:
for k, v in obj.iteritems():
if v is None:
obj[k] = 'DEFAULT'
else:
convert(v)
data = {1: 'foo', 2: None, 3: [{1: 'foo', 2: None}]}
convert(data)
print data # -> {1: 'foo', 2: 'DEFAULT', 3: [{1: 'foo', 2: 'DEFAULT'}]}
这是一个递归解决方案,它也替换了列表中的 None
s。
首先我们定义一个简单的class,Null
来替代None
.
class Null(object):
def __repr__(self):
return 'Null'
NULL = Null()
def replace_none(data):
for k, v in data.items() if isinstance(data, dict) else enumerate(data):
if v is None:
data[k] = NULL
elif isinstance(v, (dict, list)):
replace_none(v)
# Test
data = {
1: 'one',
2: ['two', 2, None],
3: None,
4: {4: None, 44: 'four'},
5: {
5: [55, 56, None],
6: {66: None, 67: None},
8: [88, {9:'nine', 99:None}, 100]
}
}
print(data)
replace_none(data)
print(data)
输出
{1: 'one', 2: ['two', 2, None], 3: None, 4: {44: 'four', 4: None}, 5: {8: [88, {9: 'nine', 99: None}, 100], 5: [55, 56, None], 6: {66: None, 67: None}}}
{1: 'one', 2: ['two', 2, Null], 3: Null, 4: {44: 'four', 4: Null}, 5: {8: [88, {9: 'nine', 99: Null}, 100], 5: [55, 56, Null], 6: {66: Null, 67: Null}}}
# replace_none_with_empty_str_in_dict.py
raw = {'place': 'coffee shop', 'time': 'noon', 'day': None}
def replace_none_with_empty_str(some_dict):
return { k: ('' if v is None else v) for k, v in some_dict.items() }
print(replace_none_with_empty_str(raw))