【问题标题】:Using list comprehension to match values of dictionaries which are stored in lists使用列表推导匹配存储在列表中的字典的值
【发布时间】:2014-08-14 21:46:21
【问题描述】:

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

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 值之间的值(需要是整数,而不是它们当前的字符串形式)。据我所知,列表理解是实现这一目标的最佳方式。查看this question 是我的概念出发点,但我对如何进行有点困惑。

我的伪代码是:

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 ={[记录 如果记录['Chr'] ==,则在数据库中记录以在 search_list 中查找 查找['Chr'] if int(lookup['St'])

TypeError:字符串索引必须是整数

有没有更好/更合适的方法将键从字符串转换为整数?

【问题讨论】:

  • 看不懂 St 和 End 部分,什么是上限/下限
  • 您使用的是什么数据库?这似乎是一个查询问题?你的StEnd 应该是整数吗?您的数据库是实际数据库还是称为数据库的列表?
  • @dm03514 数据库只是一个称为数据库的列表。正如您有帮助地指出的那样,已更新问题以反映 St 和 End,它们应该是整数。
  • @Kobi K 查看更新后的问题。它们是字典中的键。
  • @s_boardman 您收到此异常,因为其中一个字符串无法转换为 int,请确保它只是数字。你可以结合try except 声明并抓住那些给你这个问题的人。

标签: python list dictionary list-comprehension


【解决方案1】:

您可以使用list comprehension: 此代码将迭代 database dict 中的元素,并将检查 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 内的条件匹配

【讨论】:

  • 谢谢,这是有道理的。我已经尝试过了,但现在遇到了将 St 和 End 键的值从 str 转换为 int 的问题。我已经相应地更新了我的问题。
  • 更改了我的起点,使其完美运行。谢谢@KobiK!
【解决方案2】:

这是一个粗略的代码,但是这个怎么样?

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2021-05-01
    • 2022-01-13
    • 1970-01-01
    • 2014-09-02
    • 2017-05-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多