我有两个字典列表:
systolic_sex = [
{'attribute': u'bp', 'value_d': 133.0, 'value_s': u'133', 'sid': 6},
{'attribute': u'bp', 'value_d': 127.0, 'value_s': u'127', 'sid': 17},
{'attribute': u'bp', 'value_d': 121.0, 'value_s': u'121', 'sid': 18},
{'attribute': u'bp', 'value_d': 127.0, 'value_s': u'127', 'sid': 27},
{'attribute': u'bp', 'value_d': 120.0, 'value_s': u'120', 'sid': 42},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 6},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 17},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 18},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 27},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 42}
]
sex = [
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 6},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 17},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 42}
]
我希望通过键'sid'的值来匹配这些列表,这样如果两者中'sid'的值相同,我就匹配,否则,我没有。如果我有一个匹配,那么我会将两个集合中的'sid'匹配的词典附加到一个新的列表中,就像这样
new_set = [
{'attribute': u'bp', 'value_d': 133.0, 'value_s': u'133', 'sid': 6},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 6},
{'attribute': u'bp', 'value_d': 127.0, 'value_s': u'127', 'sid': 17},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 17},
{'attribute': u'bp', 'value_d': 120.0, 'value_s': u'120', 'sid': 42},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 42}
]
我尝试了各种交叉方法,包括修改Match set of dictionaries的答案,但我希望创建一个新的字典列表,它们具有匹配的sid,而不是替换两个列表之间的值。
答案 0 :(得分:3)
如果你经常处理这类数据,你可能会对使用pandas感兴趣。你的词典已经是熊猫喜欢的形式,所以你可以这样做:
import pandas
systolic_sex = pandas.DataFrame(systolic_sex)
sex = pandas.DataFrame(sex)
matches = systolic_sex[systolic_sex.sid.isin(sex.sid)]
如果您希望数据的格式与提供的格式相同,则可以
output = matches.to_dict(orient='records')
答案 1 :(得分:1)
在您关联的帖子中取消答案:
systolic_sex = dict((e['sid'], e) for e in systolic_sex)
sex = set(e['sid'] for e in sex)
matches = []
for sid,v in systolic_sex.items():
if sid not in sex: continue
matches.append(v)
答案 2 :(得分:1)
>>> uniq=set(e['sid'] for e in sex)
>>> filter(lambda d: d['sid'] in uniq, systolic_sex)
[{'attribute': u'bp', 'sid': 6L, 'value_s': u'133', 'value_d': 133.0},
{'attribute': u'bp', 'sid': 17L, 'value_s': u'127', 'value_d': 127.0},
{'attribute': u'bp', 'sid': 42L, 'value_s': u'120', 'value_d': 120.0},
{'attribute': u'SEX', 'sid': 6L, 'value_s': u'M', 'value_d': 0.0},
{'attribute': u'SEX', 'sid': 17L, 'value_s': u'M', 'value_d': 0.0},
{'attribute': u'SEX', 'sid': 42L, 'value_s': u'M', 'value_d': 0.0}]
答案 3 :(得分:1)
我最终使用了以下内容(根据@chtohnicdaemon):
import pandas
#-----> code snipped here
#----->
# iterate over record sets returned by SQLAlchemy to populate list
for result in query_right:
data = {'sid': result.patient_sid,
'value_s': result.string_value,
'value_d': result.double_value,
'attribute': result.attribute_value}
result_right.append(data)
for result in left_child:
data = {'sid': result.patient_sid,
'value_s': result.string_value,
'value_d': result.double_value,
'attribute': result.attribute_value}
result_left.append(data)
# convert list of dictionaries to data frames
right = pandas.DataFrame(right_result)
left = pandas.DataFrame(left_result)
# get matches
matches_right = right[right.sid.isin(left.sid)]
matches_left = left[left.sid.isin(right.sid)]
# combine matched sets into single set
frames = [matches_right,matches_left]
# concatenate data, drop duplicates and convert back to a list of dictionaries
result = pd.concat(frames).drop_duplicates().to_dict(orient='records')
像魅力一样工作!