我们说我有多个列表列表,在这个例子中我包含了三个缩短版本。
list1=[['name', '1A5ZA'], ['length', 83], ['A', 28], ['V', 31], ['I', 24]]
list2=[['name', '1AJ8A'], ['length', 49], ['A', 18], ['V', 11], ['I', 20]]
list3=[['name', '1AORA'], ['length', 96], ['A', 32], ['V', 49], ['I', 15]]
所有列表都采用相同的格式:它们具有相同数量的嵌套列表,具有相同的标签。
我使用以下函数生成每个列表
def GetResCount(sequence):
residues=[['A',0],['V',0],['I',0],['L',0],['M',0],['F',0],['Y',0],['W',0],
['S',0],['T',0],['N',0],['Q',0],['C',0],['U',0],['G',0],['P',0],['R',0],
['H',0],['K',0],['D',0],['E',0]]
name=sequence[0:5]
AAseq=sequence[27:]
for AA in AAseq:
for n in range(len(residues)):
if residues[n][0] == AA:
residues[n][1]=residues[n][1]+1
length=len(AAseq)
nameLsit=(['name', name])
lengthList=(['length', length])
residues.insert(0,lengthList)
residues.insert(0,nameLsit)
return residues
脚本采用如此
的序列1A5ZA:A|PDBID|CHAIN|SQUENCEMKIGIVGLGRVGSSTAFAL
将创建一个类似于上面提到的列表。 在生成每个单独的列表时,我想将其附加到最终形式,以便将它们组合在一起看起来像这样:
final=[['name', '1A5ZA', '1AJ8A', '1AORA'], ['length', 83, 49, 96], ['A', 28, 18, 32], ['V', 31, 11, 49], ['I', 24, 20, 15]]
可能数据的最终形式不是正确的格式。我对如何更好地格式化最终形式提出建议......
总而言之,脚本应该做的是获取序列名称在开头的字母序列,计算每个字母的出现次数以及序列的总长度,并输出名称长度和字母频率到列表。那么它应该将每个序列的信息组合成一个更大的列表(也许是字典?..)
最后,所有这些信息都会显示在一个如下所示的电子表格中:
name length A V I
1A5ZA 83 28 31 24
1AJ8A 49 18 11 20
1AORA 96 32 49 15
我包括最后一点,因为也许我没有开始以正确的方式开始以我想要的结果。
反正 我希望你在这里做到并感谢你的帮助!
答案 0 :(得分:1)
因此,如果您正在寻找表格,那么dict
可能是更好的方法。 (注意:collections.Counter
与计数相同),例如:
from collections import Counter
def GetResCount(sequence):
name, AAseq = sequence[0:5], sequence[27:]
residuals = {'name': name, 'length': len(AAseq), 'A': 0, 'V': 0, 'I': 0, 'L': 0,
'M': 0, 'F': 0, 'Y': 0, 'W': 0, 'S': 0, 'T': 0, 'N': 0, 'Q': 0, 'C': 0,
'U': 0, 'G': 0, 'P': 0, 'R': 0, 'H': 0, 'K': 0, 'D': 0, 'E': 0}
residuals.update(Counter(AAseq))
return residuals
In []:
GetResCount('1A5ZA:A|PDBID|CHAIN|SQUENCEMKIGIVGLGRVGSSTAFAL')
Out[]:
{'name': '1A5ZA', 'length': 19, 'A': 2, 'V': 2, 'I': 2, 'L': 2, 'M': 1, 'F': 1, 'Y': 0,
'W': 0, 'S': 2, 'T': 1, 'N': 0, 'Q': 0, 'C': 0, 'U': 0, 'G': 4, 'P': 0, 'R': 1,
'H': 0, 'K': 1, 'D': 0, 'E': 0}
注意:这可能只是你可能在Py3.6 +中查找的顺序,但我们可以在以后创建表时修复它。
然后你可以创建一个dicts列表,例如(假设您正在从文件中读取这些行):
with open(<file>) as file:
data = [GetResCount(line.strip()) for line in file]
然后您可以将其直接加载到pandas
,例如:
In []:
import pandas as pd
columns = ['name', 'length', 'A', 'V', 'I', ...] # columns = list(data[0].keys()) - Py3.6+
df = pd.DataFrame(data, columns=columns)
print(df)
Out[]:
name length A V I ...
0 1A5ZA 83 28 31 24 ...
1 1AJ8A 49 18 11 20 ...
2 1AORA 96 32 49 15 ...
...
您也可以将其转储到包含cvs.DictWriter()
的文件:
from csv import DictWriter
fieldnames = ['name', 'length', 'A', 'V', 'I', ...]
with open(<output>, 'w') as file:
writer = DictWrite(file, fieldnames)
writer.writerows(data)
会输出类似的内容:
name,length,A,V,I,...
1A5ZA,83,28,31,24,...
1AJ8A,49,18,11,20,...
1AORA,96,32,49,15 ...
...