簡體   English   中英

如何在python中過濾和打印特定的json字典

[英]How to filter and print particular json dictionaries in python

我在學習python的過程中遇到了一個json的問題無法攻克。

我在 python 中有來自 json 的數據集:

{
    "Sophos": {
        "detected": true,
        "result": "phishing site"
    },
    "Phishtank": {
        "detected": false,
        "result": "clean site"
    },
    "CyberCrime": {
        "detected": false,
        "result": "clean site"
    },
    "Spam404": {
        "detected": false,
        "result": "clean site"
    },
    "SecureBrain": {
        "detected": false,
        "result": "clean site"
    },
    "Hoplite Industries": {
        "detected": false,
        "result": "clean site"
    },
    "CRDF": {
        "detected": false,
        "result": "clean site"
    },
    "Rising": {
        "detected": false,
        "result": "clean site"
    },
    "Fortinet": {
        "detected": true,
        "result": "phishing site"
    },
    "alphaMountain.ai": {
        "detected": true,
        "result": "phishing site"
    },
    "Lionic": {
        "detected": false,
        "result": "clean site"
    },
    "Cyble": {
        "detected": false,
        "result": "clean site"
    }
}

我想以僅打印"detected": true的那些鍵和值的方式過濾這些字典。

例如我只想打印

{
    "Sophos": {
        "detected": true,
        "result": "phishing site"
    },
    "Fortinet": {
        "detected": true,
        "result": "phishing site"
    }
}

我使用 VirusTotal apikey v2 https://developers.virustotal.com/v2.0/reference/domain-report我在 python 中的代碼:

parameters = {'apikey': api_key, 'resource': domain}

response = requests.get(url, params=parameters)
    
python_response = json.loads(response.text)

scans = python_response["scans"]

example = json.dumps(python_response["scans"], indent=4)

print(example)

我正在尋找一種簡單易讀的方法來做到這一點,以便我盡可能地理解它。 我想要 Python 中的打印結果。我為此搜索並閱讀了各種解決方案(列表理解或 filter() with lambda),但它對我沒有幫助。

我還在學習,如果這是一個簡單的案例,請提前感謝您的理解。

預先感謝您的幫助和回答。

您可以使用字典理解來過濾響應字典。 請注意,在您提供的示例中,我認為您有 json 數據而不是 python true不是 python 中有效的 boolean 關鍵字,它應該是True

filtered = {k: v for k, v in orignal_dict.items() if v.get("detected") == true}

對於你的例子 -

true = True
false = False

data = {
    "Sophos": {
        "detected": true,
        "result": "phishing site"
    },
    "Phishtank": {
        "detected": false,
        "result": "clean site"
    },
    "CyberCrime": {
        "detected": false,
        "result": "clean site"
    },
    "Spam404": {
        "detected": false,
        "result": "clean site"
    },
    "SecureBrain": {
        "detected": false,
        "result": "clean site"
    },
    "Hoplite Industries": {
        "detected": false,
        "result": "clean site"
    },
    "CRDF": {
        "detected": false,
        "result": "clean site"
    },
    "Rising": {
        "detected": false,
        "result": "clean site"
    },
    "Fortinet": {
        "detected": true,
        "result": "phishing site"
    },
    "alphaMountain.ai": {
        "detected": true,
        "result": "phishing site"
    },
    "Lionic": {
        "detected": false,
        "result": "clean site"
    },
    "Cyble": {
        "detected": false,
        "result": "clean site"
    }
}


filtered = {k: v for k, v in data.items() if v.get("detected") == true}
print(json.dumps(filtered, indent=4))

Output:

{
    "Sophos": {
        "detected": true,
        "result": "phishing site"
    },
    "Fortinet": {
        "detected": true,
        "result": "phishing site"
    },
    "alphaMountain.ai": {
        "detected": true,
        "result": "phishing site"
    }
}

您可以運行一個循環,然后進行檢查

for key, value in example.items():
    if value["detected"] == True:
        print(key, value)

或者,您可以使用filter() function 來實現它。

list(filter(lambda x: x["detected"] == True, example.values()))

Output:

[{'detected': True, 'result': 'phishing site'}, {'detected': True, 'result': 'phishing site'}, {'detected': True, 'result': 'phishing site'}]

一種方法可以是:

for i in jsondump:
    if jsondump[i]['detected'] == True:
        print(jsondump[i])

就好像我們在 Jsondump 中循環使用 for each 一樣,它會導致給出所有保存數據的 object 名稱,即

for i in jsondump:
     print(i)

上面的代碼將導致:

Sophos  
Phishtank  
CyberCrime  
..  
..  
Fortinet  
alphaMountain.ai
Lionic  
Cyble  

現在如果我們有密鑰,我們可以使用 jsondump[i] 循環並將值存儲在 'detected' 中,因此我們將傳入 jsondump[i]['detected'] 以檢查它是否為真。

在這里我們可以使用字典理解

new_dict = { key:val for (key,val) in example.items() if(value["detected"] == True)}

將根據您想要的條件創建一個新列表,檢測到的條件應該為真

在這里,我們遍歷整個字典,然后對於也是字典的每個元素(在本例中為 val),我們檢查檢測到的值是否為 True 然后我們只將整個字典添加到 new_dict

您可以按值使用過濾器 Python 字典使用通用 Function和 lambda,檢查以下示例:

dataset = {
    "Sophos": {
        "detected": True,
        "result": "phishing site"
    },
    "Phishtank": {
        "detected": False,
        "result": "clean site"
    },
    "CyberCrime": {
        "detected": False,
        "result": "clean site"
    },
    "Spam404": {
        "detected": False,
        "result": "clean site"
    },
    "SecureBrain": {
        "detected": False,
        "result": "clean site"
    },
    "Hoplite Industries": {
        "detected": False,
        "result": "clean site"
    },
    "CRDF": {
        "detected": False,
        "result": "clean site"
    },
    "Rising": {
        "detected": False,
        "result": "clean site"
    },
    "Fortinet": {
        "detected": True,
        "result": "phishing site"
    },
    "alphaMountain.ai": {
        "detected": True,
        "result": "phishing site"
    },
    "Lionic": {
        "detected": False,
        "result": "clean site"
    },
    "Cyble": {
        "detected": False,
        "result": "clean site"
    }
}

def filter_dict(d, f):
    ''' Filters dictionary d by function f. '''
    newDict = dict()
    # Iterate over all (k,v) pairs in dict
    for key, value in d.items():
        # Is condition satisfied?
        if f(key, value):
            newDict[key] = value
    return newDict

print(filter_dict(dataset, lambda k, v: v['detected'] == True))

Output:

{'Sophos': {'detected': True, 'result': 'phishing site'}, 'Fortinet': {'detected': True, 'result': 'phishing site'}, 'alphaMountain.ai': {'detected': True, 'result': 'phishing site'}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM