我有一个字典列表,其中所有字典都包含相似的项目,但有些字典缺少某些项目。这是一个看起来像的例子:
data = [
{
'city' : Toronto,
'colour' : blue
},
{
'city' : London,
'country' : UK
'colour' : green,
'name' : Alex
},
{
'city' : Kingston,
'colour' : purple,
'name' : Alex
}
]
我需要通过在较小的dict中插入项(具有相同的键但空白值)来匹配最大dict的格式。我还需要保留键的顺序,所以我不能只在最后插入它们。在前面的示例之后,它看起来像这样:
data = [
{
'city' : Toronto,
'country' : ,
'colour' : blue,
'name' :
},
{
'city' : London,
'country' : UK
'colour' : green,
'name' : Alex
},
{
'city' : Kingston,
'country' : ,
'colour' : purple,
'name' : Alex
}
]
我不确定如何遍历并向每个字典添加条目,因为我正在比较的字典大小不同。我尝试复制最大的字典并对其进行编辑,将空白值添加到每个字典的末尾并重新格式化它们,并在我循环浏览时创建新的字典,但到目前为止没有任何效果。 到目前为止,这是我的代码(all_keys是按正确顺序列出的所有键的列表)。
def format_data(input_data, all_keys)
formatted_list = [{} for i in range(len(input_data)) ]
increment = 0
for i in range(len(input_data)):
for key, value in input_data[i].items():
if (key == all_keys[increment]):
formatted_list[i][increment].update(all_keys[increment], ''))
else:
formatted_list[i][inrement].update(key, value)
increment += 1
increment = 0
return formatted_list
如何格式化?谢谢!
答案 0 :(得分:2)
字典被认为是无序的(除非您使用的是Python 3.7+)。如果需要特定的订单,则必须明确指定。
对于Python <3.7,您可以使用collections.OrderedDict
:没有“插入字典中间”的概念。
下面的示例使用set.union
计算所有键的并集;和sorted
来按字母顺序对键进行排序。
from collections import OrderedDict
keys = sorted(set().union(*data))
res = [OrderedDict([(k, d.get(k, '')) for k in keys]) for d in data]
结果:
print(res)
[OrderedDict([('city', 'Toronto'),
('colour', 'blue'),
('country', ''),
('name', '')]),
OrderedDict([('city', 'London'),
('colour', 'green'),
('country', 'UK'),
('name', 'Alex')]),
OrderedDict([('city', 'Kingston'),
('colour', 'purple'),
('country', ''),
('name', 'Alex')])]
答案 1 :(得分:0)
您可以使用set
:
import json
d = [{'city': 'Toronto', 'colour': 'blue'}, {'city': 'London', 'country': 'UK', 'colour': 'green', 'name': 'Alex'}, {'city': 'Kingston', 'colour': 'purple', 'name': 'Alex'}]
full_keys = {i for b in map(dict.keys, d) for i in b}
final_dict = [{i:b.get(i) for i in full_keys} for b in d]
print(json.dumps(final_dict, indent=4))
输出:
[
{
"colour": "blue",
"city": "Toronto",
"name": null,
"country": null
},
{
"colour": "green",
"city": "London",
"name": "Alex",
"country": "UK"
},
{
"colour": "purple",
"city": "Kingston",
"name": "Alex",
"country": null
}
]