Сравнивать словари и показывать только различия в Python? - PullRequest
0 голосов
/ 25 июня 2018

У меня есть два словаря, и я хотел бы сравнить их и перечислить различия: я подумал о том, чтобы сделать это, так как это словари, что не так просто после проверки других ответов здесь.Еще один способ - превратить их в датафрейм с пандами?Я хотел бы принять во внимание те же столбцы, которые не в том же порядке.Таким образом, проверка должна выполняться по имени.

Например, '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')}

правильнее будет показать оба словаря'различия.

1 Ответ

0 голосов
/ 25 июня 2018

Если вы просто хотите найти симметричные различия между двумя из OrderedDicts,

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'))}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...