[英]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
的計數大於 1的dataElement
。
例如 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.