使用python在JSON中查找重复项

时间:2017-07-30 20:02:34

标签: python json linux cloudera cloudera-manager

我是python的新手,我试图实现以下目标: 向cloudera-Manager的IP发送获取请求,该IP返回具有以下结构的主机JSON:

{
  "items" : [ {
    "hostId" : "ddcfbea6-8a7c-462c-38f9-0116338e438a",
    "ipAddress" : "1.2.3.4",
    "hostname" : "host.example.com",
    "rackId" : "/rack01",
    "hostUrl" : "http://host.example.com:7180/cmf/hostRedirect/ddcfbea6-8a7c-462c-38f9-0116338e438a"
  }
...
}

JSON可以包含数百个元素,我希望找到具有相同ipAddress条目值的所有元素,并打印它们及其键和值。 我怎样才能做到这一点?我使用请求模块发送get请求。

2 个答案:

答案 0 :(得分:2)

对于名为hosts的JSON对象,

hosts = {
  "items" : [ {
    "hostId" : "ddcfbea6-8a7c-462c-38f9-0116338e438a",
    "ipAddress" : "1.2.3.4",
    "hostname" : "host.example.com",
    "rackId" : "/rack01",
    "hostUrl" : "http://host.example.com:7180/cmf/hostRedirect/ddcfbea6-8a7c-462c-38f9-0116338e438a"
  }
...
}

您可以按照

这样的IP地址对项目进行分组
grouped_items = {}
for item in hosts["items"]:
        ip_address = item["ipAddress"]
        if ip_address in grouped_items:
                grouped_items[ip_address].append(item)
        else:
                grouped_items[ip_address] = [item]

答案 1 :(得分:0)

您可以创建将IP地址映射到对象列表的字典。例如(如果d是您的示例字典):

ipToObjects = {}

for item in d['items']:
    if 'ipAddress' not in item:
        continue
    ip = item['ipAddress']
    if ip not in ipToObjects:
        ipToObjects[ip] = []
    ipToObject[ip].append(item)

现在,如果你想查找重复项,你可以这样做:

duplicates = [ ip for ip in ipToObjects.keys() if len(ipToObjects) >1 ]    
for ip in duplicates:
    print(ipToObjects[ip])

或根据您的需要做类似的事情。