[英]Convert a list of objects to a dictionary of lists
我有一個 JSON 對象的列表,已經排序(比如說按時間)。 每個 JSON object 都有type
和status
。 例如:
[
{'type': 'A', 'status': 'ok'},
{'type': 'B', 'status': 'ok'},
{'type': 'A', 'status': 'fail'}
]
我想將其轉換為:
{
'A': ['ok', 'fail'],
'B': ['ok']
}
所以當然這是一個簡單的任務,但我正在尋找 Pythonic 的方式來做這件事,所以它可以讓我省去幾行代碼
由於您的新結構還依賴於較舊的(已處理的)鍵,我懷疑您是否可以使用字典理解(基於每個鍵操作)來實現所需的最終 state。
我更喜歡使用defaultdict ,其中每個默認鍵都是一個列表。
from collections import defaultdict
new_data = defaultdict(list)
for item in data:
new_data[item['type']].append(item['status'])
print(new_data)
這給出了 output:
defaultdict(<class 'list'>, {'A': ['ok', 'fail'], 'B': ['ok']})
我不知道是否有單線,但您可以使用setdefault
或defaultdict
來實現所需的結果:
data = [
{'type': 'A', 'status': 'ok'},
{'type': 'B', 'status': 'ok'},
{'type': 'A', 'status': 'fail'}
]
使用setdefault()
:
res = {}
for elt in data:
res.setdefault(elt['type'], []).append(elt['status'])
Output:
{'A': ['ok', 'fail'], 'B': ['ok']}
使用defaultdict
:
from collections import defaultdict
res = defaultdict(list)
for elt in data:
res[elt['type']].append(elt['status'])
Output:
defaultdict(<class 'list'>, {'A': ['ok', 'fail'], 'B': ['ok']})
具有多個列表推導和sorted(set(…))
以刪除重復鍵的單行:
original = [
{"type": "A", "status": "ok"},
{"type": "B", "status": "ok"},
{"type": "A", "status": "fail"},
]
result = {
key: [x["status"] for x in original if x["type"] == key]
for key in sorted(set([x["type"] for x in original]))
}
Output:
{'A': ['ok', 'fail'], 'B': ['ok']}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.