最快的方法:对于DictA中的值,在DictB中查找值并检索其他DictB值?

2024-09-29 05:28:45 发布

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

对于dictA中的每个项目,我想在dictB中搜索它,如果dictB有它,那么我想从dictB中提取一些其他值并将其添加到dictA中

这里有一个有效的例子,但是它相当慢,因为我有50000多个项目要搜索,它将在多个dict上执行类似的功能

是否有执行此搜索的快速方法

dictA = [
    {'id': 12345},
    {'id': 67890},
    {'id': 11111},
    {'id': 22222}
]

dictB = [
    {'id': 63351, 'name': 'Bob'},
    {'id': 12345, 'name': 'Carl'},
    {'id': 59933, 'name': 'Amy'},
    {'id': 11111, 'name': 'Chris'}
]

for i in dictA:
    name = None
    for j in dictB:
        if i['id'] == j['id']:
            name = j['name']
    i['name'] = name

在此之后的dictA输出将是:

dictA = [
    {'id': 12345, 'name': 'Carl'},
    {'id': 67890, 'name': None},
    {'id': 11111, 'name': 'Chris'},
    {'id': 22222, 'name': None}
]

Tags: 项目方法namein功能noneidfor
1条回答
网友
1楼 · 发布于 2024-09-29 05:28:45
  • 给定的是dict列表。您可以根据该列表创建dict,前提是id是非唯一的。从list of dict转换为dict将适用于您的案例
dictA = [
    {'id': 12345},
    {'id': 67890},
    {'id': 11111},
    {'id': 22222}
]

dictB = [
    {'id': 63351, 'name': 'Bob'},
    {'id': 12345, 'name': 'Carl'},
    {'id': 59933, 'name': 'Amy'},
    {'id': 11111, 'name': 'Chris'}
]


actual_dictB = dict()
for d in dictB:
    actual_dictB[d['id']] = d['name']

for i in dictA:
    i['name'] = actual_dictB.pop(i['id'], None) # now search have became O(1) constant. So best time complexity achived O(n) n=length of dictA

print(dictA)
  • 跟进其他问题:
actual_dictB = dict()
for d in dictB:
    id_ = d['id']
    d.pop('id')
    actual_dictB[id_] = d

    
tmp = dict([(k,None) for k in dictB[0].keys() if k!='id'])
           
for i in dictA:
    if i['id'] not in actual_dictB:
        i.update(tmp)
    else:
        i.update(actual_dictB[i['id']])
print(dictA)

相关问题 更多 >