DICT列表将键值从一个更改为多个,再从多个更改为一个

2024-09-29 17:14:37 发布

您现在位置:Python中文网/ 问答频道 /正文

用一个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]}
]

Tags: ininfo列表forparameterresdictoff
2条回答

这里有一个使用理解和^{}的解决方案。首先将列表转换为集合,以进行快速成员资格测试;然后直接构建结果。它的效率不如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()))
]

使用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()]

相关问题 更多 >

    热门问题