我有两个不同的词典列表,
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}]
如何通过像“ list_C”一样包含其余的键来基于“计数”键找到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}]
我想保留list2中的键,但是list1中的值缺少以“-”表示的值。
答案 0 :(得分:11)
您也可以为此使用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 -
答案 1 :(得分: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}]
(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}]
答案 2 :(得分:2)
假设list1
中的词典共享相同的键,并且您拥有Python 3.5或更高版本,则可以编写以下列表推导。
>>> count2dict = {d['count']:d for d in list1}
>>> dummies = dict.fromkeys(list1[0], '-')
>>> [{**count2dict.get(d['count'], dummies), **d} for d in list2]
[{'count': 359, 'att_value': 'nine', 'person_id': 4},
{'count': 351, 'att_value': 'one', 'person_id': 12},
{'count': 381, 'att_value': '-', 'person_id': 8}]
答案 3 :(得分:1)
使用更详细的for
循环,更新list2
的对象:
for item2 in list2:
item2['att_value'] = '-'
item1 = [ item1 for item1 in list1 if item1['count'] == item2['count'] ]
if item1: item2.update(item1[0])
print(list2)
#=> [{'count': 359, 'person_id': 4, 'att_value': 'nine'}, {'count': 351, 'person_id': 12, 'att_value': 'one'}, {'count': 381, 'person_id': 8, 'att_value': '-'}]