在Python中找到两个字典列表之间的区别

发布于 2021-01-29 15:05:08

我试图找到字典2列表之间的区别。我在该论坛中找到了一些信息,但没有达到我的目的。

incoming_rows = [{'column_name': 'LOAD_ID', 'data_type': 'int', 'table_name': 'CONFIG'},
            {'column_name': 'ROW_NUMBER', 'data_type': 'int', 'table_name': 'CONFIG'},
            {'column_name': 'CREATE_DATE', 'data_type': 'VARCHAR(20)', 'table_name': 'CONFIG'},
            {'column_name': 'CONFIG_TYPE', 'data_type': 'varchar(1)', 'table_name': 'CONFIG'},
            {'column_name': 'CONFIG_ID', 'data_type': 'numeric(10,0)', 'table_name': 'CONFIG'}
            ]

available_row = [{'column_name': 'LOAD_ID', 'data_type': 'int', 'table_name': 'CONFIG'},
             {'column_name': 'ROW_NUMBER', 'data_type': 'int', 'table_name': 'CONFIG'},
             {'column_name': 'CREATE_DATE', 'data_type': 'date', 'table_name': 'CONFIG'}
             ]

在这里,我需要将传入行与字典的available_row列表进行比较,差异要以另一种dict格式列表进行列出。这里我的表名是唯一的。条件:1.任何新添加的列。2.数据类型的任何更改如果这两个条件为true,则Expected_row应该仅包含这些更改的行。

# expected output
expected_row=[{'column_name': 'CONFIG_TYPE', 'data_type': 'varchar(1)', 'table_name': 'CONFIG'},
          {'column_name': 'CONFIG_ID', 'data_type': 'numeric(10,0)', 'table_name': 'CONFIG'},
          {'column_name': 'CREATE_DATE', 'data_type': 'VARCHAR(20)', 'table_name': 'CONFIG'}
        ]
关注者
0
被浏览
126
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    集合是解决此问题的完美解决方案。不幸的是,python不允许您将字典添加到集合中,因为它们是可变的,并且其哈希码可能会在插入和查找之间改变。

    如果“冻结”项目以使其不可变,则可以将其添加到设置对象而不是列表中。然后使用减号运算符设定一个差值:

    In [20]: i_set = { frozenset(row.items()) for row in incoming_rows }
    
    In [21]: a_set = { frozenset(row.items())  for row in available_row }
    
    In [22]: (i_set - a_set)
    Out[22]: 
    {frozenset({('column_name', 'CONFIG_ID'),
                ('data_type', 'numeric(10,0)'),
                ('table_name', 'CONFIG')}),
     frozenset({('column_name', 'CREATE_DATE'),
                ('data_type', 'VARCHAR(20)'),
                ('table_name', 'CONFIG')}),
     frozenset({('column_name', 'CONFIG_TYPE'),
                ('data_type', 'varchar(1)'),
                ('table_name', 'CONFIG')})}
    

    编辑:要解冻:

    In [25]: [dict(i) for i in i_set - a_set]
    Out[25]: 
    [{'column_name': 'CONFIG_ID',
      'data_type': 'numeric(10,0)',
      'table_name': 'CONFIG'},
     {'column_name': 'CREATE_DATE',
      'data_type': 'VARCHAR(20)',
      'table_name': 'CONFIG'},
     {'column_name': 'CONFIG_TYPE',
      'data_type': 'varchar(1)',
      'table_name': 'CONFIG'}]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看