Python 如何获取JSON文件中两个元素之间的差异

Python 如何获取JSON文件中两个元素之间的差异,python,json,Python,Json,我有两个结构相同的JSON文件: a_communities = {"communities": [{"group": "D06@domain.com", "members": ["member1", "member2"]}, {"group": "D07@domain.com", "members": ["member3"]}]} b_communities = {"communities": [{"group": "D06@domain.com", "members": ["member1"

我有两个结构相同的JSON文件:

a_communities = {"communities": [{"group": "D06@domain.com", "members": ["member1", "member2"]}, {"group": "D07@domain.com", "members": ["member3"]}]}
b_communities = {"communities": [{"group": "D06@domain.com", "members": ["member1", "member2", "members3"]}, {"group": "D07@domain.com", "members": ["member4"]}]}
我想了解两个文件中同一组的区别:获取两个文件中属于/不属于同一组的成员

我已尝试让他们使用此功能:

def get_g_members_from_value(group, value):
    for g_community in g_communities['communities']:
        if g_community['group'] == str(group): #the same group then:
            print "***"+str(reduce(lambda v1,v2: v1 or v2, list(set(g_community['members']).difference(value))))
            if [i for i, j in zip(g_community['members'] , value) if i != j] != []:
                print "members are not equal for group :"+str(group)
                print "-- g members :"+str(g_community['members'])
                print "-- c members :"+str(value)
                print "-- diff :"+ str([i for i, j in zip(g_community['members'] , value) if i != j])

for c_community in c_communities['communities']:
    get_g_members_from_value(c_community['group'], c_community['members'])

我已经打印了更多的结果以查看差异,但它无法获得差异,我的代码有什么问题?

要将我的注释扩展为代码,我首先将您当前拥有的结构转换为字典,格式为每个社区的
{'group\u name':set(group\u members)}

>>> a_members = {d['group']: set(d['members']) for d in a_communities['communities']}
>>> b_members = {d['group']: set(d['members']) for d in b_communities['communities']}
>>> a_members
{'D06@domain.com': set(['member1', 'member2']), 'D07@domain.com': set(['member3'])}
>>> b_members
{'D06@domain.com': set(['members3', 'member1', 'member2']), 'D07@domain.com': set(['member4'])}
然后使用

以及:

了解两个社区成员的差异和相似性。这一切都假定:

  • 每个
    都有一个唯一的名称;及
  • 成员
    列表包含哈希对象

  • 假设每个
    都有一个唯一的名称,将每个社区转换为
    {group:set(members)}
    形式的字典可能会更容易,然后只需使用
    set.difference
    即可获得社区之间的更改。@jornsharpe:您想说两个集合:
    {group:set(members\a\u communities)},{same\u group:set(members_b_communities}
    如何获得差异?在两个词典之间使用(或)来表示相同的键(即相同的组)。
    >>> for key in a_members:
        print key, a_members[key].symmetric_difference(b_members[key])
    
    
    D06@domain.com set(['members3'])
    D07@domain.com set(['member4', 'member3'])
    
    >>> for key in a_members:
        print key, a_members[key].intersection(b_members[key])
    
    
    D06@domain.com set(['member1', 'member2'])
    D07@domain.com set([])