如何使用不同大小的列表创建python字典?

如何使用不同大小的列表创建python字典?,python,regex,list,dictionary,Python,Regex,List,Dictionary,我一直在学习使用正则表达式操作字符串,但遇到了一个问题,即使用我正在使用的一些数据格式化字典。下面是我正在努力解决的代码的简化版本: 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(

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

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代表k,v在ziplist1,list2}进行了实验,这就是我被告知用两个列表制作词典的方式,而我似乎不知道如何让它在列表中插入一个列表。我该怎么做呢?

您可以使用列表理解来构建元组对的完整蛋白质列表,然后使用dict理解来过滤空列表值。这可以在一个单独的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']}

您可以使用列表理解来构建元组对的完整蛋白质列表,然后使用dict理解来过滤空列表值。这可以在一个单独的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']}

替换\u站点=。。。对于NGly_Sites.appender.findallr'N[^P][ST][^P]',数据格式是什么?替换NGly_Sites=。。。对于NGly_Sites.appender.findallr'N[^P][ST][^P]”,数据格式是什么?谢谢你的回答,但我认为OP不需要B,因为它指向一个空列表。如果你加上过滤,你的答案和我的差不多。此外,只有代码的答案会被机器人自动标记,并放入一个审查队列中,以便进行潜在的删除,因此添加一个解释对于增加未来访问者的答案值有很大的帮助。感谢您的回答,但我认为OP不需要B,因为它指向的是一个空列表。如果你加上过滤,你的答案和我的差不多。此外,只有代码的答案会被机器人自动标记,并放入审查队列中进行潜在删除,因此添加解释对于增加未来访问者的答案价值有很大帮助。