python - 比较字典并仅显示 Python 中的差异?

标签 python pandas dictionary

我有两个字典,想比较它们并列出差异: 我考虑这样做,因为它们是字典,在检查了其他答案后这并不容易。另一种方法是用 pandas 将它们转换为数据框?我想也考虑顺序不同的相同列。因此应该通过名称进行检查。

例如,“KAEK”在第二个字典中列出的位置较低,如果它们的名称数据类型和长度相同,则不应仅仅因为两个字典中的顺序不同而将其视为不同。我该怎么做?

pst.schema

{'properties': OrderedDict([('KAEK', 'str:12'),
              ('PROP_TYPE', 'str:4'),
              ('ORI_TYPE', 'int:1'),
              ('ORI_CODE', 'str:100'),
              ('DEC_ID', 'str:254'),
              ('ADDRESS', 'str:254'),
              ('NUM', 'str:9'),
              ('LEN', 'float:19.11'),
              ('AREA', 'float:19.11')]),
 'geometry': 'Polygon'}


pst2.schema

{'properties': OrderedDict([('OBJECTID_1', 'int:9'),
              ('OBJECTID', 'int:9'),
              ('FID_PERIVL', 'int:9'),
              ('DESC_', 'str:254'),
              ('PROP_TYPE', 'str:4'),
              ('Shape_Leng', 'float:19.11'),
              ('Shape_Le_1', 'float:19.11'),
              ('Shape_Area', 'float:19.11'),
              ('PARCEL_COD', 'str:254'),
              ('KAEK', 'str:50'),
              ('NUM', 'int:4'),
              ('DEC_ID', 'int:4'),
              ('ADDRESS', 'int:4'),
              ('ORI_CODE', 'int:4'),
              ('ORI_TYPE', 'int:4')]),
 'geometry': 'Polygon'}

我正在考虑将它们按如下顺序排列:

df = pd.DataFrame(pst2, columns=['NUM', 'DEC_ID','OBJECTID_1'])#place all the columns
#which doesn't work 

但如果确实如此,两个词典之间不同列之间的任何间隙都会造成困惑。 例如,如果第一个中的列是:

A,B,C

第二个:

A,B,B2,C

无法正确比较。因此应该按名称进行比较。

总结:比较这些并显示是否有任何组合与其他组合不同。要么是其他列中不存在的额外列,要么是这样的:

'ADDRESS', 'str:254'         #from 1st dictionary
'ADDRESS', 'int:4'           #from 2nd dictionary

尝试显示属于哪个字典:

 pprint(set(('d1', el) if el in d1.items() else ('d2', el) for el in d2))


{('d2', 'ADDRESS'),
 ('d2', 'DEC_ID'),
 ('d2', 'DESC_'),
 ('d2', 'FID_PERIVL'),
 ('d2', 'KAEK'),
 ('d2', 'NUM'),
 ('d2', 'OBJECTID'),
 ('d2', 'OBJECTID_1'),
 ('d2', 'ORI_CODE'),
 ('d2', 'ORI_TYPE'),
 ('d2', 'PARCEL_COD'),
 ('d2', 'PROP_TYPE'),
 ('d2', 'Shape_Area'),
 ('d2', 'Shape_Le_1'),
 ('d2', 'Shape_Leng')}

正确的做法是显示两个词典的差异。

最佳答案

如果您只想找到两个 OrderedDict 之间的对称差异,

from collections import OrderedDict

>>> d1 = {'properties': OrderedDict([('KAEK', 'str:12'),
...               ('PROP_TYPE', 'str:4'),
...               ('ORI_TYPE', 'int:1')...

>>> d1 = d1['properties']

>>> d2 = {'properties': OrderedDict([('OBJECTID_1', 'int:9'),
...               ('OBJECTID', 'int:9'),
...               ('FID_PERIVL', 'int:9')...

>>> d2 = d2['properties']
<小时/>
>>> from pprint import pprint
>>> pprint(d1)
OrderedDict([('KAEK', 'str:12'),
             ('PROP_TYPE', 'str:4'),
             ('ORI_TYPE', 'int:1')...

>>> pprint(d2)
OrderedDict([('OBJECTID_1', 'int:9'),
             ('OBJECTID', 'int:9'),
             ('FID_PERIVL', 'int:9')...
<小时/>
pprint(set.symmetric_difference(set(d1.items()), set(d2.items())))
{('ADDRESS', 'int:4'),
 ('ADDRESS', 'str:254'),
 ('AREA', 'float:19.11'),
 ('DEC_ID', 'int:4'),
 ('DEC_ID', 'str:254'),
 ('DESC_', 'str:254'),
 ('FID_PERIVL', 'int:9'),
 ('KAEK', 'str:12'),
 ('KAEK', 'str:50'),
 ('LEN', 'float:19.11'),
 ('NUM', 'int:4'),
 ('NUM', 'str:9'),
 ('OBJECTID', 'int:9'),
 ('OBJECTID_1', 'int:9'),
 ('ORI_CODE', 'int:4'),
 ('ORI_CODE', 'str:100'),
 ('ORI_TYPE', 'int:1'),
 ('ORI_TYPE', 'int:4'),
 ('PARCEL_COD', 'str:254'),
 ('Shape_Area', 'float:19.11'),
 ('Shape_Le_1', 'float:19.11'),
 ('Shape_Leng', 'float:19.11')}

然后按照您想要的方式使用结果?

请求进一步编辑OP,

>>> d3 = set.symmetric_difference(set(d1.items()), set(d2.items()))
>>> pprint(set(('d1', el) if el in d1.items() else ('d2', el) for el in d3))
{('d1', ('ADDRESS', 'str:254')),
 ('d1', ('AREA', 'float:19.11')),
 ('d1', ('DEC_ID', 'str:254')),
 ('d1', ('KAEK', 'str:12')),
 ('d1', ('LEN', 'float:19.11')),
 ('d1', ('NUM', 'str:9')),
 ('d1', ('ORI_CODE', 'str:100')),
 ('d1', ('ORI_TYPE', 'int:1')),
 ('d2', ('ADDRESS', 'int:4')),
 ('d2', ('DEC_ID', 'int:4')),
 ('d2', ('DESC_', 'str:254')),
 ('d2', ('FID_PERIVL', 'int:9')),
 ('d2', ('KAEK', 'str:50')),
 ('d2', ('NUM', 'int:4')),
 ('d2', ('OBJECTID', 'int:9')),
 ('d2', ('OBJECTID_1', 'int:9')),
 ('d2', ('ORI_CODE', 'int:4')),
 ('d2', ('ORI_TYPE', 'int:4')),
 ('d2', ('PARCEL_COD', 'str:254')),
 ('d2', ('Shape_Area', 'float:19.11')),
 ('d2', ('Shape_Le_1', 'float:19.11')),
 ('d2', ('Shape_Leng', 'float:19.11'))}

关于python - 比较字典并仅显示 Python 中的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51018409/

相关文章:

python - 错误优化器参数在 Keras 函数中不合法

python - 如何在 pandas 数据框中获取与 SQL 中的 LIKE 运算符等效的值?

python - pickling dict 继承类缺少内部值

python - 按时间过滤 Pandas 数据框(不是日期)

python - 类中角色的pygame运动不起作用

python - 无法在 Pandas 数据框中用零填充 NaN

python - Networkx:计算和存储图形上到 Pandas 数据框的最短路径

reactjs - 如何在 React TS 中为对象(Map 数据结构)中的每个项目渲染自定义元素?

firebase - Flutter 从 QuerySnapshot 转换为 Future <List<Map<dynamic,dynamic>>>

python - 用python循环绘制棋盘