不清楚的python数据结构和解析python

时间:2016-06-02 20:57:02

标签: python biopython

我有一个小数据集,用于通过BioPython的pairwise2模块获得全局对齐结果。到目前为止,我已经得到了对齐和得分结果,现在我对结果的结构以及如何解析它们有疑问

下面是我的代码:

import pandas as pd
from Bio import pairwise2
from Bio.SubsMat import MatrixInfo as matlist

matrix = matlist.blosum62
match = 5
mismatch = -4 
gap_open = -10
gap_extend = -0.5


df = {'ID': ['H576','H577','H578'],
  'CD': ['GCACGCATAAGTAGT', 'GCGAGGGGGGCTTC', 'GCGAGAGATCGGG']}


df = pd.DataFrame(df)


dictionary = df.set_index('ID')['CD'].to_dict()

seq = dictionary.get('H576')

for seq0 in df.CD:
        alns = pairwise2.align.globalms(seq, seq0,  match, mismatch,    gap_open, gap_extend)
        print(alns)

结果:

 [('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15)]

 [('GCACGCATAAGTAGT-----', 'GCG------AGGGGGGCTTC', -15.5, 0, 20), ('GCACGCATAAGTAGT-----', 'GC------GAGGGGGGCTTC', -15.5, 0, 20)], ....]

 [('GCA------CGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21), ('GC------ACGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21)]GGGGGC--------TTCAGAGAGTTATAGGCTGTTTGACTAC', 'GTGAGAGATGCGCCGCGTATTC---GA-----AGCTTCTTTGACTAC', 55.5, 0, 47)],....] 

我的问题:

显然,结果包含3个主要集合,但上面的结果是什么数据结构?套?元组?集和元组?

我只想查看每组中的第一组项目:

('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15)

('GCACGCATAAGTAGT-----', 'GCG------AGGGGGGCTTC', -15.5, 0, 20)

('GCA------CGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21)
然后在循环中,将每个集合的第一个序列指定为seq0,将每个seq的第二个序列指定为seq1,然后我将对它们执行某些操作:

所以对于第一集:

seq0 = 'GCACGCATAAGTAGT'
seq1 = 'GCACGCATAAGTAGT'

第二集:

seq0 = 'GCACGCATAAGTAGT-----'
seq1 = 'GCG------AGGGGGGCTTC'
第三集:

seq0 = 'GCA------CGCATAAGTAGT'
seq1 = 'GCGAGAGATCG--------GG'

4 个答案:

答案 0 :(得分:2)

在我看来,它们是元组列表。

[]表示列表

()表示元组(只读列表)

实现所要求的最简单方法是将项目从列表中索引,如下所示:

# Renamed seq0 so it doesn't interfere with below variable
for sequence0 in df.CD:
    alns = pairwise2.align.globalms(seq, sequence0,  match, mismatch, gap_open, gap_extend)
    # This is how you would get the first group of items from each tuple
    first_group_of_items = alns[0]

    # Now to get the seq variables you asked for
    # Since this variable is seq0, the above seq0 was renamed
    seq0 = first_group_of_items[0]
    seq1 = first_group_of_items[1]

我怀疑您可以使用更好的命名策略,但我对生物学知识不足以帮助您进入该部门。

答案 1 :(得分:1)

在你的情况下,你有一个元组列表。

要访问每个列表的第一个元素,您可以这样做:

list[0]

因为列表包含元组,所以它将返回完整的元组。

然后,一旦你得到你的元组,你可以将前两个值取为:

seq0 = tuple[0]
seq1 = tuple[1]

如果您不想存储中间价值,可以直接执行:

seq0 = list[0][0]
seq1 = list[0][1]

我希望它有所帮助。祝你今天愉快。

添加到示例中:

In [16]: A =  [('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15)]

In [17]: A[0]
Out[17]: ('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15)

In [18]: A[0][0]
Out[18]: 'GCACGCATAAGTAGT'

In [19]: A[0][1]
Out[19]: 'GCACGCATAAGTAGT'

答案 2 :(得分:1)

看起来像list ()tuples []

如果您确定要保留第一个,请保留第一个:

sequences = []
for seq0 in df.CD:
    alns = pairwise2.align.globalms(seq, seq0,  match, mismatch,    gap_open, gap_extend)
    sequences.append(alns[0])

这样你就会得到:

sequences == [('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15),
              ('GCACGCATAAGTAGT-----', 'GCG------AGGGGGGCTTC', -15.5, 0, 20),
              ('GCA------CGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21)]

你需要的是什么,然后用它们做点什么,只需遍历列表:

for seq1, seq2, *rest in sequences:
    # Do the job with seq1 and seq2...

如果您关心这三个值(并知道它们的含义),您应该正确命名它们,而不是像我一样:

for seq1, seq2, name, this, properly in sequences:
    # Do the job with seq1, seq2, name, this, and properly.

答案 3 :(得分:1)

如果你真的希望它们存储在名为seq0seq1的变量中(我们会在问题中忽略程序中alns内容/输出的无效样本显示:

#! /usr/bin/env python
from __future__ import print_function

alns_seq = (
    [('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15)],
    [('GCACGCATAAGTAGT-----', 'GCG------AGGGGGGCTTC', -15.5, 0, 20),
     ('GCACGCATAAGTAGT-----', 'GC------GAGGGGGGCTTC', -15.5, 0, 20)],
    [('GCA------CGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21),
     ('GC------ACGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21)]
)

for i, alns in enumerate(alns_seq, start=1):
    seq0, seq1 = alns[0][:2]
    print("Set No. %d:" % (i,))
    print(" seq0 = '%s'" % (seq0,))
    print(" seq1 = '%s'" % (seq1,))

的产率:

Set No. 1:
 seq0 = 'GCACGCATAAGTAGT'
 seq1 = 'GCACGCATAAGTAGT'
Set No. 2:
 seq0 = 'GCACGCATAAGTAGT-----'
 seq1 = 'GCG------AGGGGGGCTTC'
Set No. 3:
 seq0 = 'GCA------CGCATAAGTAGT'
 seq1 = 'GCGAGAGATCG--------GG'

这应该回答您的上述问题并满足上述要求。

可以进行一些改进,您可以随时索取; - )