簡體   English   中英

將對象列表轉換為列表字典

[英]Convert a list of objects to a dictionary of lists

我有一個 JSON 對象的列表,已經排序(比如說按時間)。 每個 JSON object 都有typestatus 例如:

[
    {'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']})

我不知道是否有單線,但您可以使用setdefaultdefaultdict來實現所需的結果:

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.

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