使用列表推导匹配存储在列表中的字典值
我有两个字典列表需要进行比较:
search_list =[{'Chr':'chr1','St':'2345','End':'2456'},
{'Chr':'chr1','St':'3457','End':'4567'}]
和
database = [{'Chr':'chr1','St':'2348','End':'2348'},
{'Chr':'chr1','St':'190','End':'190'}]
因此,每个列表中的字典看起来是这样的:
{'Chr':'chr1','St':'2345','End':'2456'}
其中 Chr 代表染色体,St 代表起始坐标,End 代表结束坐标。
我需要找出数据库中那些在 Chr 值上匹配,并且在 St 和 End 值之间的记录(这些值需要是整数,而不是现在的字符串形式)。根据我的理解,列表推导式是实现这个目标的最佳方法。我参考了这个问题,但我对如何继续有点困惑。
我的伪代码是:
matched = [var for var in search_list where search_list['Chr'] == database['Chr'] AND search_list['St'] >= database['St'] <= search_list['End']]
但显然这还很粗糙!任何建议都非常欢迎。
更新 我尝试了 KobiK 的建议,看起来应该可以工作。但现在我在将 'St' 和 'End' 键对应的值从字符串转换为整数时遇到了问题,以便进行数学计算。
这是我目前的代码:
matchedVars ={[record for record in database for lookup in search_list if
record['Chr'] == lookup['Chr'] if int(lookup['St']) <= int(record['St'])
<= int(lookup['End'])]}
但是它抛出了这个错误:
文件 "snp_freq_V1-4.py",第 86 行,
matchedVars = {[record for record in database for lookup in search_list if record['Chr'] == lookup['Chr'] if int(lookup['St']) <= int(record['St']) <= int(lookup['End'])]}
TypeError: 字符串索引必须是整数
有没有更好或更合适的方法将键从字符串转换为整数?
2 个回答
-1
这段代码有点粗糙,不过这样怎么样呢?
matched = []
for d in search_list:
for db in database:
if d["Chr"] == db["Chr"]:
if db["St"] >= d["St"] and db["St"] <= d["End"]:
matched.append(db)
print matched
希望这能帮到你
2
你可以使用列表推导式:这段代码会遍历database
字典里的元素,并检查它们是否符合search_list
中的条件。
search_list =[{'Chr':'chr1','St':'2345','End':'2456'},{'Chr':'chr2','St':'3457','End':'4567'}]
database = [{'Chr':'chr1','St':'2348','End':'2348'},{'Chr':'chr2','St':'190','End':'190'}]
print [record for record in database for lookup in search_list
if record['Chr'] == lookup['Chr'] if lookup['St'] <= record['St'] <= lookup['End']]
输出结果:
[{'Chr': 'chr1', 'End': '2348', 'St': '2348'}]
从输出结果中可以看到,只有{'Chr': 'chr1', 'End': '2348', 'St': '2348'}
符合search_list
中的条件。