gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:48:10 28 4
gpt4 key购买 nike

我有两个字典,想比较它们并列出差异:我考虑这样做,因为它们是字典,在检查了其他答案后这并不容易。另一种方法是用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com