我一直在学习使用正则表达式来操作字符串,但是在用我正在处理的某些数据格式化字典时遇到了问题。这是我正在努力的代码的简化版本:
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 zip(list1,list2)中的k,v}},这是我被告知制作包含两个列表的字典的方式,以及我似乎无法弄清楚如何在列表中插入列表。我该怎么做呢?
答案 0 :(得分:2)
您可以使用列表推导来构建元组对的完整蛋白质列表,然后使用字典推导来过滤出空列表值。这可以通过一次dict理解来完成,但是将其分为两个步骤会更清晰一些,并且省去了mylist
来提取蛋白质序列的尴尬额外调用。
findall
答案 1 :(得分:1)
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']}