使用列表推导匹配存储在列表中的字典值

0 投票
2 回答
1467 浏览
提问于 2025-04-18 10:54

我有两个字典列表需要进行比较:

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中的条件。

撰写回答