我目前有一个以数字索引作为键的字典。我知道字典中应该有多少值,并且想要添加字典中缺少的键和一个空值。为了说明这一点,我包含了这个例子:
dictionary = {'0' : '101',
'1' : '102',
'2' : '100',
'4' : '100.5',
'6' : '103'}
我知道我的字典里有8个值,所以我想写一个函数把上面的字典变成:
dictionary = {'0' : '101',
'1' : '102',
'2' : '100',
'3' : None,
'4' : '100.5',
'5' : None,
'6' : '103',
'7' : None}
谁知道怎么做到这一点?提前谢谢。
假设N
为项目数
{**dictionary, **{k: None for k in range(N + 1) if str(k) not in dictionary.keys()}}
然而,在dictionary
中使用整数作为键可能更好,这样您就不必强制转换为str
编辑感谢schwobaseggl的评论,一个更好的版本是
{**{str(k): None for k in range(N + 1)}, **dictionary}
参见python
中dict
合并问题
可以这样做:
m = max(map(int, dictionary))
for i in map(str, range(m)):
if i not in dictionary:
dictionary[i] = None
但是这是否必要是值得怀疑的,因为您可以很容易地在查找时提供默认值:对于丢失的键,dictionary.get(key)
无论如何都会返回None
。
类似这样的代码应该可以达到这个效果:
dictionary = {'0' : '101', '1' : '102', '2' : '100', '4' : '100.5', '6' : '103'}
key_list = ['0','1','2','3','4','5','6','7']
for k in key_list:
try:
dictionary[k]
except KeyError:
dictionary[k] = None
否则,如果您知道您的值彼此紧跟着,则可以使用以下函数:
def complete_dict(my_dict, begin_at=0, stops_at=8):
for key in range(begin_at, stops_at):
if str(key) not in my_dict.keys():
my_dict[str(key)] = None
return my_dict
然后从begin_at
转到stops_at - 1
。
因此,既然您知道它从0开始并转到某个值,那么您可以使用range来遍历所有项。如果已经存在,则使用相同的值,如果不存在,则添加None。
d = {'0' : '101', '1' : '102', '2' : '100', '4' : '100.5', '6' : '103'}
for i in range(0, 7):
d[str(i)] = d.get(str(i), None)
d = dict(sorted(d.items()))
print(d)
或者,您可以创建一个新字典,而不是使用相同的字典并按键排序,它将自动排序,因为您是按顺序添加它们的。
如果您使用键作为字符串(如在您的示例中)。如果它们是整型的,就不用str(i)
,只用i
你不能只用if k not in dictionary: dictionary[k] = None
吗?或者更花哨的dictionary[k] = dictionary.get(k)
如果字典中没有None
,您可以填充它们:
dictionary = {'0' : '101', '1' : '102', '2' : '100', '4' : '100.5', '6' : '103'}
keys = ['0','1','2','3','4','5','6','7']
for k in keys:
if k not in dictionary:
dictionary[k] = None
或者如果你想更花哨:
dictionary = {'0' : '101', '1' : '102', '2' : '100', '4' : '100.5', '6' : '103'}
keys = ['0','1','2','3','4','5','6','7']
for k in keys:
dictionary[k] = dictionary.get(k)
dictionary.get(k)
将通过键k
或None
返回值,如果该值不在dictinary
中。
上面的例子可以很好地填充none,但是您应该考虑,也许在从字典中检索值的地方,使用dictionary.get(key, None)
而不是dictionary[key]
。这样,对于不存在的键,您将获得None,并拥有原始字典。