объединение нескольких списков списков в Python 3 - PullRequest
0 голосов
/ 01 июня 2018

скажем, у меня есть несколько списков списков, в этом примере я добавлю сокращенную версию из трех из них.

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 голосов
/ 01 июня 2018

Так что, если вы ищете стол, то 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 +, но мы можем исправить это позже, какпри необходимости мы создаем таблицу.

Затем вы можете создать список диктовок, например (при условии, что вы читаете эти строки из файла):

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 ...
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...