确保列表中的所有dicts都具有相同的键

Man*_*ert 2 python dictionary list set

我有一个列表,如词典

[{'x': 42}, {'x': 23, 'y': 5}]
Run Code Online (Sandbox Code Playgroud)

并且想要确保所有dicts具有相同的键,None如果键不存在于原始字典中则值.所以上面的列表应该成为

[{'x': 42, 'y': None}, {'x': 23, 'y': 5}]
Run Code Online (Sandbox Code Playgroud)

什么是最美丽和pythonic的方式来做到这一点?目前的做法:

keys = reduce(lambda k, l: k.union(set(l)), [d.keys() for d in my_list], set())
new_list = [dict.fromkeys(keys, None) for i in xrange(len(my_list))]
for i, l in enumerate(my_list):
    new_list[i].update(l)
Run Code Online (Sandbox Code Playgroud)

但特别是前两行似乎有些笨拙.想法?

jam*_*lak 5

>>> from itertools import chain 
>>> l = [{'x': 42}, {'x': 23, 'y': 5}]
>>> all_keys = set(chain.from_iterable(l))   
>>> for d in l:
        d.update((k,None) for k in all_keys-d.viewkeys())


>>> l
[{'y': None, 'x': 42}, {'y': 5, 'x': 23}]
Run Code Online (Sandbox Code Playgroud)

  • 很好,虽然`链`似乎更快(列出~3000个每个~10个键的序列):`%timeit set(k表示d in l表示k表示m)`:`1000循环,最佳3:4.86 ms每个循环``%timeit set(chain.from_iterable(l))`:`1000循环,最佳3:每循环2.61毫秒` (2认同)