将项目插入字典的中间

时间:2018-07-22 21:32:56

标签: python list dictionary

我有一个字典列表,其中所有字典都包含相似的项目,但有些字典缺少某些项目。这是一个看起来像的例子:

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

如何格式化?谢谢!

2 个答案:

答案 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
 } 
]