在Python中,将字典列表a与列表C与具有a和C共同属性的列表B进行匹配?

2024-10-03 23:18:26 发布

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

我有三个字典列表,A,B和C。它们看起来像:

A = [{propA1: valueA1}, {propA1: valueA2}, ...]
B = [{propB1: valueB1, propB2: valueB2}, {propB1: valueB3, propB2: value4}, ...]
C = [{propC1: valueC1}, {propC1: valueC2}, ...]

propA1propB1是相同的属性,但名称不同,propB2propC1也是相同的属性。 然而,propA1propB1并不总是有相同的值,但我只对数组[valueA1, valueA2, ...][valueB1, valueB2, ...]的“集合相交”感兴趣,这里的目标是:我想返回B中的所有propB2,这样它们的propB1对应项(在同一个字典中)与A中的propA1匹配。然后我将使用该propB2集合来匹配propC1C

我尝试过:

propB2_match = set()
for elementB in B:
    for elementA in A:
        if elementB['propB1'] == elementA['propA1']:
            propB2_match(elementB['propB2'])            
            break

在这个循环的末尾,我有propB2_match包含所有propB2,我可以用它来匹配propC1。 但是,从循环中可以看到,这是一个昂贵的O(n^2)循环。我想知道有没有办法用O(n)来处理这个问题?如果没有,是否有任何pythonic优化可以做的呢?你知道吗

注意:我不想把它放在数据库中并使用关系数据库SQL来处理连接操作。你知道吗


Tags: infor字典属性matchvalueb2elementaelementb
1条回答
网友
1楼 · 发布于 2024-10-03 23:18:26

如果我理解正确的话,您尝试在a和B上做一个连接,其中列a['propA1']==B['propB1']。你知道吗

使用defaultdict的一种方法是O(len(A)+len(B)):

from collections import defaultdict

A = [{'pA1': 'vA1'}, {'pA1': 'vA2'}]
B = [{'pB1': 'vA1', 'pB2': 'vB2'}, {'pB1': 'vB3', 'pB2': 'v4'}]

# Key by the value you want to group on
kA = [(x['pA1'],x) for x in A]
kB = [(x['pB1'],x) for x in B]

# Combine the lists
kAB = kA+kB

# Map each unique key to a list of elements that have that key
results = defaultdict(list)
for x in kAB:
    results[x[0]].append(x[1])

for x in results:
    print results[x]

输出:

[{'pA1': 'vA2'}]
[{'pB1': 'vB3', 'pB2': 'v4'}]
[{'pA1': 'vA1'}, {'pB1': 'vA1', 'pB2': 'vB2'}]

此时,您可以将每个dict列表合并为一个dict或任何您需要的内容,并使用结果与第三个列表C连接

相关问题 更多 >