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

unclear python data structure and parse python

我有一个小数据集,我用它来获取 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'

在你的例子中,你有一个元组列表。

要访问每个列表的第一个元素,您只需执行以下操作:

list[0]

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

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

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'

看起来像 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.

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

[] 表示列表

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

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

# 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]

我怀疑您可以使用更好的命名策略,但我对生物学的了解还不够多,无法在该部门为您提供帮助。

如果您确实希望将它们存储在名为 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'

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

有些改进是可能的,您可以随时提出要求;-)