比较清单的字典结构(dict-> dict) [英] Dictionary Structure (dict -> dict) with a list in it comparison

查看:117
本文介绍了比较清单的字典结构(dict-> dict)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

具有此字典->字典->列表结构

想比较2种这种结构.

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]}}

此代码运行良好:

def compare(one,two):
    for mainkey in one:
        for subkey in one[mainkey]:
            return set(one[mainkey][subkey]) ^ set(two[mainkey][subkey])

但是,当dict-> dict具有更多或更少的键时,应该由添加或删除键以及所有列表值的函数返回.

如果列表已被修改,则应由修改列表的程序返回它.

有人可以为此提供帮助吗?

它几乎用于比较两个JSON,我想查看何时删除,添加键或修改键的值.

更新1:

我还在学习Python

对于此结构:

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]},"119": ["test10","test11"]}

它不起作用.

它应该打印为输出:

 118 was modified. New values Blue. 119 was added with values test10 test11
 

,并且在以下情况下:

1.

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": }

应打印为输出:

 118 was removed with values test1 test2 test3 tcp 22 Red 0.0.0.0/0
 

2.

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test100", "test200", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]},"119": ["test10","test11"]}

应打印为输出:

 118 was modifed. New values test100 test200
 

我想介绍所有可能的情况.正如我在JSON比较中所说的那样,我做到了.

解决方案

我在您的字典中添加了一些子项,以提供每种情况的示例:

one = {"1iG5NDGVre": {"116": ["commonkey1", "commonkey2"], "118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"],"117": ["test4", "test5", "test6", "tcp", "42", "Fucsia", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"116": ["commonkey1", "commonkey2"], "118": ["test100", "test200", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"],"119": ["test10","test11"]}}

其中:

  • 116同时存在且未修改
  • 118同时存在,已修改
  • 117仅存在于one
  • 119仅存在于two

然后我们遍历字典:

def compare(one,two):
    for mainkey in one:
        # Here we are iterating at "1iG5NDGVre" key level
        # We want to know the keys which has been added, removed, and modified
        # keys removed:
        for key in set(one[mainkey].keys()).difference(two[mainkey].keys()):
            print "{0} was removed. Removed values: {1}".format(key, one[mainkey][key])
        # keys added:
        for key in set(two[mainkey].keys()).difference(one[mainkey].keys()):
            print "{0} was added. Added values: {1}".format(key, two[mainkey][key])
        # keys modified
        for key in set(one[mainkey].keys()).intersection(two[mainkey].keys()):
            if set(one[mainkey][key]) ^ set(two[mainkey][key]): print("{0} was modified. New values {1}".format(key, set(one[mainkey][key]) ^ set(two[mainkey][key])))


compare(one,two)
# OUTPUT:
# 117 was removed. Removed values: ['test4', 'test5', 'test6', 'tcp', '42', 'Fucsia', '0.0.0.0/0']
# 119 was added. Added values: ['test10', 'test11']
# 118 was modified. New values set(['Blue', 'test1', 'test2', 'test100', 'test200'])

这是怎么回事:

set(one[mainkey].keys()).difference(two[mainkey].keys()) # returns 117, aka what is present in 'one' but not in 'two'

set(two[mainkey].keys()).difference(one[mainkey].keys()) # returns 119, aka what is present in 'two' but not in 'one'

set(one[mainkey].keys()).intersection(two[mainkey].keys()) # returns 116, 118, aka keys present in both

请注意,当我们检查两个元素都存在时,我们总是返回一些内容:如果值相等,则为空列表[],否则将返回具有不同值的列表.

此外,我们使用的是sets,它仅接受唯一值:

set(["a", "a", "b", "b", "b", "c"]) # returns ("a", "b", "c").

这对字典来说不会有问题,因为键也是唯一的,但可能会给列表带来一些问题.如果您想解决此问题,可以使用列表理解 ,这也是改进先前代码的好方法.我建议您也查看 Python设置操作

Have this dict -> dict -> list structure

Want to compare 2 structures of this kind.

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]}}

This code works well:

def compare(one,two):
    for mainkey in one:
        for subkey in one[mainkey]:
            return set(one[mainkey][subkey]) ^ set(two[mainkey][subkey])

However when dict -> dict have more or less keys it should be returned by a function that key was added or removed along with all list values.

Also if list was modified, it should be returned by the program that the list was modified.

Anybody can help on this?

It is pretty much used to compare two JSONs, I want to see when keys were removed, added or its values modified.

Update 1:

I am still learning Python

For this structure:

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]},"119": ["test10","test11"]}

It does not work.

It should print as output:

118 was modified. New values Blue. 119 was added with values test10 test11

and for these scenarios:

1.

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": }

Should print as output:

118 was removed with values test1 test2 test3 tcp 22 Red 0.0.0.0/0

2.

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test100", "test200", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]},"119": ["test10","test11"]}

Should print as output:

118 was modifed. New values test100 test200

I want to cover all possible cases. I do this as I said for JSON comparison.

解决方案

I added some subkey to your dictionary to have an example for each case:

one = {"1iG5NDGVre": {"116": ["commonkey1", "commonkey2"], "118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"],"117": ["test4", "test5", "test6", "tcp", "42", "Fucsia", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"116": ["commonkey1", "commonkey2"], "118": ["test100", "test200", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"],"119": ["test10","test11"]}}

where:

  • 116 is present in both, not modified
  • 118 is present in both, modified
  • 117 is present only in one
  • 119 is present only in two

Then we iterate through our dictionary:

def compare(one,two):
    for mainkey in one:
        # Here we are iterating at "1iG5NDGVre" key level
        # We want to know the keys which has been added, removed, and modified
        # keys removed:
        for key in set(one[mainkey].keys()).difference(two[mainkey].keys()):
            print "{0} was removed. Removed values: {1}".format(key, one[mainkey][key])
        # keys added:
        for key in set(two[mainkey].keys()).difference(one[mainkey].keys()):
            print "{0} was added. Added values: {1}".format(key, two[mainkey][key])
        # keys modified
        for key in set(one[mainkey].keys()).intersection(two[mainkey].keys()):
            if set(one[mainkey][key]) ^ set(two[mainkey][key]): print("{0} was modified. New values {1}".format(key, set(one[mainkey][key]) ^ set(two[mainkey][key])))


compare(one,two)
# OUTPUT:
# 117 was removed. Removed values: ['test4', 'test5', 'test6', 'tcp', '42', 'Fucsia', '0.0.0.0/0']
# 119 was added. Added values: ['test10', 'test11']
# 118 was modified. New values set(['Blue', 'test1', 'test2', 'test100', 'test200'])

Here what's happening:

set(one[mainkey].keys()).difference(two[mainkey].keys()) # returns 117, aka what is present in 'one' but not in 'two'

set(two[mainkey].keys()).difference(one[mainkey].keys()) # returns 119, aka what is present in 'two' but not in 'one'

set(one[mainkey].keys()).intersection(two[mainkey].keys()) # returns 116, 118, aka keys present in both

notice that when we check element present in both, we always return something: an empty list [] if values are equal, or a list with the different values.

Also, we are using sets, which accept only unique values:

set(["a", "a", "b", "b", "b", "c"]) # returns ("a", "b", "c").

this won't be a problem with the dictionaries, since the keys are also unique, but may create some problem with the lists. If you want to work around this problem, you can use list comprehension, which are also a good way to improve the previous code. I suggest you to also have a look on Python set operation

这篇关于比较清单的字典结构(dict-> dict)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆