簡體   English   中英

dicts 列表 - 將鍵值從一到多更改為多到一

[英]list of dicts - change key values from one to many to many to one

使用 dict 列表,像下面這樣說list1

[
  {'subId': 0, 'mainIds': [0]}, 
  {'subId': 3, 'mainIds': [0, 3, 4, 5], 'parameter': 'off', 'Info': 'true'}
]

需要轉換為以下格式。

[
  {'mainId': 0, 'subIds':[0,3]},
  {'mainId': 3, 'subIds': [3] },
  {'mainId': 4, 'subIds': [3] },
  {'mainId': 5, 'subIds': [3]}
]

到目前為止嘗試了什么

    finalRes = []
    for i in list1:
        subId = i['subId']
        for j in i['mainIds']:
            res = {}
            res[mainId] = j
            res['subIds'] = []
            res['subIds'].append(subId)
            finalRes.append(res)

這提供了更接近所需輸出的東西。 需要幫助獲取上述輸出。 這種操作有沒有流行的名稱(類似於一對多對多對一?)

[
    {'mainId': 0, 'subIds':[0]},
    {'mainId': 0, 'subIds':[3]}
    {'mainId': 3, 'subIds': [3]},
    {'mainId': 4, 'subIds': [3]},
    {'mainId': 5, 'subIds': [3]}
]

使用defaultdict可以輕松實現這種連接:

subs_by_main_id = defaultdict(list)
for entry in list1:
    sub_id = entry['subId']
    for main_id in entry['mainIds']:
        subs_by_main_id[main_id].append(sub_id)
return [{'mainId': main_id, 'subIds': sub_ids}
        for main_id, sub_ids in sub_by_main_id.items()]

這是使用理解和itertools.chain的解決方案。 首先將列表轉換為集合,以進行快速成員資格測試; 然后直接構建結果。 它不如defaultdict解決方案有效。

from itertools import chain

sets = { d['subId']: set(d['mainIds']) for d in data }

result = [
    {'mainId': i, 'subIds': [ j for j, v in sets.items() if i in v ]}
    for i in set(chain.from_iterable(sets.values()))
]

暫無
暫無

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

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