【问题标题】:How do you create a python dictionary using lists of different size?如何使用不同大小的列表创建 python 字典?
【发布时间】:2020-03-29 20:20:58
【问题描述】:

我一直在学习使用正则表达式来操作字符串,但在使用我正在处理的一些数据格式化字典时遇到了问题。这是我正在努力解决的代码的简化版本:

import re

line=">sp|A|PE=3 SV=1 IDMANTTI >sp|B|PE=3 SV=1 EVPFYPKA >sp|C| PE=3 SV=2 QRWLFNYSGNISN"

NGly_Sites=[]
protein_list=[]

p_and_a=re.findall(r'sp\|(\w+)\|.+?SV=\d\s([A-Z]+)', line) 
for protein, amino in p_and_a:
    print(protein, amino)
    protein_list.append(protein)
    NGly_Sites=re.findall(r'N[^P][ST][^P]', amino)
    print(NGly_Sites)
Sites={k:v for k,v in zip(protein_list, NGly_Sites)}
print(Sites)

然后打印出来:

A IDMANTTI
['NTTI']
B EVPFYPKA
[]
C QRWLFNYSGNISN
['NYSG', 'NISN']
{'A': 'NYSG', 'B': 'NISN'

我正在尝试将我命名为“蛋白质”的项目与我在 python 中使用 .findall() 函数找到的结果序列进行匹配。基本上我想做以下事情:

{'A':['NTTI'],'C':['NYSG','NISN']}

我不明白为什么使用 .findall() 函数找到并放入字典中的对象是在所有键('A'、'B'、'C')下完成的,而不是它们的特定键或为什么我似乎无法在一个键下附加使用 .findall() 找到的对象列表。我确定这只是与语法有关,但我已经尝试过 {k:v for k,v in zip(list1,list2)} 这就是我被告知制作包含两个列表的字典的方式,并且我似乎无法弄清楚如何让它在列表中插入列表。我该怎么做?

【问题讨论】:

  • NGly_Sites.append(re.findall(r'N[^P][ST][^P]', amino))替换NGly_Sites=...
  • 那个数据格式是什么?

标签: python regex list dictionary


【解决方案1】:

您可以使用列表推导构建一个完整的元组对蛋白质列表,然后使用字典推导过滤掉空列表值。这可以在单个 dict 理解中完成,但将其分为两个步骤会更清晰一些,并且可以节省对 findall 的尴尬额外调用以提取蛋白质序列。

import re

line = ">sp|A|PE=3 SV=1 IDMANTTI >sp|B|PE=3 SV=1 EVPFYPKA >sp|C| PE=3 SV=2 QRWLFNYSGNISN"
protein_pattern = r"sp\|(\w+)\|.+?SV=\d\s([A-Z]+)"
sites_pattern = r"N[^P][ST][^P]"

all_proteins = [
    (k, re.findall(sites_pattern, v)) 
    for k, v in re.findall(protein_pattern, line)
]
sites = {k: v for k, v in all_proteins if v}

print(sites) # => {'A': ['NTTI'], 'C': ['NYSG', 'NISN']}

【讨论】:

    【解决方案2】:
    import re
    
    line=">sp|A|PE=3 SV=1 IDMANTTI >sp|B|PE=3 SV=1 EVPFYPKA >sp|C| PE=3 SV=2 QRWLFNYSGNISN"
    
    p_and_a=re.findall(r'sp\|(\w+)\|.+?SV=\d\s([A-Z]+)', line) 
    
    sites =  { protein : re.findall(r'N[^P][ST][^P]', amino)  for protein, amino in p_and_a }
    
    print(sites)
    
    # {'A': ['NTTI'], 'B': [], 'C': ['NYSG', 'NISN']}
    
    

    【讨论】:

    • 感谢您的回答,但我认为 OP 不想要 B,因为它指向一个空列表。如果您添加过滤器,您的答案将非常适合我。此外,机器人会自动标记纯代码答案并将其放入审查队列以供可能删除,因此添加解释对于为未来的访问者增加答案的价值大有帮助。
    猜你喜欢
    • 2021-08-24
    • 2018-09-17
    • 2016-01-08
    • 1970-01-01
    • 2021-04-02
    • 2020-02-26
    • 1970-01-01
    • 2018-05-18
    • 2022-11-18
    相关资源
    最近更新 更多