基于密钥的两个字典列表的交集

Mah*_*a M 11 python dictionary list python-3.x

我有两个不同的词典列表,

list1 = [{'count': 351, 'att_value': 'one'},
         {'count': 332,  'att_value': 'two'},
         {'count': 336,  'att_value': 'six'},
         {'count': 359,  'att_value': 'nine'},
         {'count': 304,  'att_value': 'four'}]

list2 = [{'count': 359,'person_id' : 4},
         {'count': 351, 'person_id' : 12},
         {'count': 381, 'person_id' : 8}]
Run Code Online (Sandbox Code Playgroud)

如何通过将其余的键包含在list_C中来基于"count"键找到list_A和list_B的交集?

list3 = [{'count':359, 'att_value' : 'nine', 'person_id':4},
         {'count':351, 'att_value' : 'one', 'person_id':12},
         {'count':381, 'att_value' : '-', 'person_id':8}] 
Run Code Online (Sandbox Code Playgroud)

我想保留list2中的键,但是list1中缺少的值由" - "表示.

May*_*wal 13

你也可以使用pandas库:

In [102]: df1 = pd.DataFrame(list1)
In [104]: df2 = pd.DataFrame(list2)

In [106]: pd.merge(df2,df1, on='count', how='left').fillna('-')
Out[106]: 
     count att_value
0    359      nine
1    351       one
2    381         -
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 9

您可以使用列表理解来完成此操作.首先,从中构建一组所有计数list2,然后根据常量时间集成员资格检查过滤掉字典.

counts = {d2['count'] for d2 in list2}
list3 = [d for d in list1 if d['count'] in counts]

print(list3)
# [{'count': 351, 'att_value': 'one', 'person_id': 12}, 
#  {'count': 359, 'att_value': 'nine', 'person_id': 4}]
Run Code Online (Sandbox Code Playgroud)

(Re:Edit)要适当地处理其他键(除了"att_value"),以相同的方式给出默认值" - ",您可以使用:

keys = list1[0].keys() - {'count'}
idx = {d['count'] : d for d in list1}
list3 = []
for d in list2:
    d2 = idx.get(d['count'], dict.fromkeys(keys, '-'))
    d2.update(d)
    list3.append(d2)

print(list3)
# [{'count': 359, 'att_value': 'nine', 'person_id': 4},
#  {'count': 351, 'att_value': 'one', 'person_id': 12},
#  {'person_id': 8, 'att_value': '-', 'count': 381}]
Run Code Online (Sandbox Code Playgroud)