在python 3中合并多个列表列表

时间:2018-06-01 02:39:58

标签: python-3.x list dictionary

我们说我有多个列表列表,在这个例子中我包含了三个缩短版本。

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

我包括最后一点,因为也许我没有开始以正确的方式开始以我想要的结果。

反正 我希望你在这里做到并感谢你的帮助!

1 个答案:

答案 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 ...
...