python - 如何使用不同大小的列表创建 python 字典?
问题描述
我一直在学习使用正则表达式操作字符串,但遇到了一个问题,用我正在使用的一些数据格式化字典。这是我正在努力解决的代码的简化版本:
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)} 这就是我被告知制作包含两个列表的字典的方式,并且我似乎无法弄清楚如何让它在列表中插入列表。我该怎么做呢?
解决方案
您可以使用列表推导来构建元组对的完整蛋白质列表,然后使用字典推导来过滤掉空列表值。这可以在单个 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']}
推荐阅读
- postgresql - 如何在 postgres 中为数字类型自动使用适当的精度/比例?
- ruby-on-rails - Centos 7:确保 `gem install pg -v '0.18.4' --source
- accessibility - 为网站构建“高对比度”模式以满足可访问性标准?
- sql - 检测每个 ID 的更改
- python - 格式化电话号码 - CSV 和正则表达式
- python - matplotlib 和 matplotlib-base 之间的区别?
- azure - Azure 操作组不为 Outlook 联系人组发送电子邮件
- powershell - 如何检查用户是否具有管理员权限
- swift - 我不知道我必须做什么才能使(2)工作..迅速
- python - Seaborn 和 Pandas,分组箱线图