簡體   English   中英

計算字典列表中鍵值大於 1 的對象數

[英]Count number of objects in list of dictionary where a key's value is more than 1

給定一個字典列表:

data = {
    "data": [
        {
            "categoryOptionCombo": {
                "id": "A"
            },
            "dataElement": {
                "id": "123"
            }
        },
        {
            "categoryOptionCombo": {
                "id": "B"
            },
            "dataElement": {
                "id": "123"
            }
        },
        {
            "categoryOptionCombo": {
                "id": "C"
            },
            "dataElement": {
                "id": "456"
            }
        }
    ]
}

我想顯示不同categoryOptionCombo的計數大於 1dataElement

例如 function 的結果將是一個可迭代的 ID:

[123]

因為id為 123 的dataElement兩個不同的categoryOptionCombos

tracker = {}
for d in data['data']:
    data_element = d['dataElement']['id']
    coc = d['categoryOptionCombo']['id']
    if data_element not in tracker:
        tracker[data_element] = set()
    tracker[data_element].add(coc)

too_many = [key for key,value in tracker.items() if len(value) > 1]

我怎樣才能最好地用理解來迭代字典列表? 上面的這個解決方案不是pythonic。

一種方法:

import collections
counts = collections.defaultdict(set)

for d in data["data"]:
    counts[d["dataElement"]["id"]].add(d["categoryOptionCombo"]["id"])

res = [k for k, v in counts.items() if len(v) > 1]
print(res)

Output

['123']

這種方法創建了一個字典,將dataElements映射到不同類型的categoryOptionCombo

defaultdict(<class 'set'>, {'123': {'B', 'A'}, '456': {'C'}})

幾乎是單線:

counts = collections.Counter( d['dataElement']['id'] for d in data['data'] )
print( counts )

Output:

Counter({'123': 2, '456': 1})

不需要集合,您只需記住每個數據元素的第一個 coc 或將其標記為“多個”。

tracker = {}
for d in data['data']:
    data_element = d['dataElement']['id']
    coc = d['categoryOptionCombo']['id']
    if tracker.setdefault(data_element, coc) != coc:
        tracker[data_element] = 'multiple'

too_many = [key for key,value in tracker.items() if value == 'multiple']

(如果字符串 'multiple' 可以是 coc id,則使用multiple = object()並與is進行比較)。

暫無
暫無

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

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