【问题标题】:Changing the index in a list更改列表中的索引
【发布时间】:2019-10-30 09:47:08
【问题描述】:

我的数据中有字符串,在我的输出中看起来像这样:

string_sequence = 'MLSPDLPDSAWNTRLLCRVMLCLLGAGSVAAGVIQSPRHLIKEKRETATLKCYPIPRHDTVYWYQQGPGQDPQFLISFYEKMQSDKGSIPDRFSAQQFSDYHSELNMSSLELGDSALYFCASSL'

在下一步中,我必须用 typsin-enzym 消化这个氨基酸序列,它将序列从字符串 K 和 R 中分离出来,但如果有 P 它就没有。
输出是我需要的肽,并保存在列表的数据类型中,如下所示:

list_sequence =    ['MLSPDLPDSAWNTR', 'LLCR', 'VMLCLLGAGSVAAGVIQSPR', 'HLIK', 'EK', 'R', 'ETATLK', 'CYPIPR', 'HDTVYWYQQGPGQDPQFLISFYEK', 'MQSDK', 'GSIPDR', 'FSAQQFSDYHSELNMSSLELGDSALYFCASSL']

现在我的索引有问题,我可以在我的数据库中找到它。
在氨基酸序列的第 18 位是V
我现在必须在我的列表数据类型中的完全相同的位置找到V
我可以通过手工计算氨基酸来找到这一点,但在 1000 个氨基酸的序列长度中,这可能是个问题。

我现在的想法是这样的:
我知道每个list_sequence[i]的索引都是以0开头的。

有什么办法,我可以在我的代码中说list_sequence[1] 中的索引以len(list_sequence[0]) 开头,list_sequence[2] 的索引以18 开头。所以在最后一个位置之后的下一个数字list_sequence-index.

感谢您的贡献!

【问题讨论】:

  • 你能澄清一下“list_sequence[2] 的索引以 18 开头”是什么意思吗?索引是一个数字,它不能以数字开头。你想让list_sequence[2]返回V还是VMLCLLGAGSVAAGVIQSPR ?或者您只是想要一个从list_sequencestring_sequence 的索引的单独 映射?
  • 所有 list_sequence-indices 中都有一个字符串。这些索引总是从零开始。我的问题或目标是更改这些索引的起始编号。你知道python中有什么功能可以做到这一点吗?
  • 所以你想让list_sequence[2][18]返回V?和list_sequence[2][17] 成为IndexError
  • list_sequence 中的第一个案例丢失了 18,因为我将字符串转换为列表。由于将所有 list_sequence[i] 的开头覆盖为零,因此位置会丢失
  • 我了解您丢失了哪些信息。我了解您想保留它,但不是您需要的格式。

标签: python python-3.x list indexing


【解决方案1】:

不,你不能。也许最易读的方法是存储链接到序列本身的每个序列的大小,或者存储一个累积的大小增量。

list_sequence =    ['MLSPDLPDSAWNTR', 'LLCR', 'VMLCLLGAGSVAAGVIQSPR', 'HLIK', 'EK', 'R', 'ETATLK', 'CYPIPR', 'HDTVYWYQQGPGQDPQFLISFYEK', 'MQSDK', 'GSIPDR', 'FSAQQFSDYHSELNMSSLELGDSALYFCASSL']

cumulative = 0
for idx, item in enumerate(list_sequence):
  len_item = len(item)
  list_sequence[idx] = (item, len_item, cumulative)
  cumulative += len_item

print(list_sequence) 

输出(每个列表的第一个元素是你的 sub_sequence,第二个是它的长度,第三个是你的初始完整序列中子序列的起始 idx)

[('MLSPDLPDSAWNTR', 14, 0), ('LLCR', 4, 14), ('VMLCLLGAGSVAAGVIQSPR', 20, 18), ('HLIK', 4, 38), ('EK', 2, 42), ('R', 1, 44), ('ETATLK', 6, 45), ('CYPIPR', 6, 51), ('HDTVYWYQQGPGQDPQFLISFYEK', 24, 57), ('MQSDK', 5, 81), ('GSIPDR', 6, 86), ('FSAQQFSDYHSELNMSSLELGDSALYFCASSL', 32,92)]

【讨论】:

    【解决方案2】:

    您可以通过创建一个为您进行索引映射的类来处理这个问题:

    class sequence:
        def __init__(self, seq):
            self.amino_seq=seq
            self.__split__sequence__()
    
        def __split__sequence__(self):
            #self.peptides =list()
            self.peptides_offset = list()
            count = 0
            for i in range(0, len(self.amino_seq)):
                if self.amino_seq[i]=='K' or self.amino_seq[i]=='R':
                    #self.peptides.append(self.amino_seq[count:i+1])
                    self.peptides_offset.append(count)
                    count = i+1
            #self.peptides.append(self.amino_seq[count:len(self.amino_seq)])
            self.peptides_offset.append(len(self.amino_seq))
    
        def __getitem__(self, i):
            return self.amino_seq[i]
    
        def peptide(self, i):
            return self.amino_seq[self.peptides_offset[i]:self.peptides_offset[ i + 1]]
    
        def peptide_amino(self, tup):
            if tup[1]<0:
                return self.amino_seq[self.peptides_offset[tup[0]]]
            else:
                return self.amino_seq[self.peptides_offset[tup[0]] + tup[1]]
    
        def peptide_offset(self, tup):
            if tup[1]<0:
                return self.peptides_offset[tup[0]]
            else:
                return self.peptides_offset[tup[0]] + tup[1]
    
        def get_peptide_tuple(self, i):
            count=0
            for j in self.peptides_offset:
                if j>=i:
                    return (count, i-j)
                count = count+1
            return (-1,-1)
    
        def get_number_of_peptides(self):
            return len(self.peptides_offset)-1
    

    然后你可以像这样使用它:

    for i in range(0,seq.get_number_of_peptides()):
        print seq.peptide(i)
    
    print seq[18]
    print seq.peptide_amino((2,0))
    print seq.peptide_offset((2,0))
    print seq[seq.peptide_offset((2,0))]
    print seq.get_peptide_tuple(18)
    print seq[seq.peptide_offset(seq.get_peptide_tuple(18))]
    

    哪个输出

    MLSPDLPDSAWNTR
    有限责任公司
    VMLCLLGAGSVAAGVIQSPR
    HLIK
    EK
    R
    ETATLK CYPIPR
    HDTVYWYQQGPGQDPQFLISFYEK
    MQSDK
    GSIPDRFSAQQFSDYHSELNMSSLELGDSALYFCASSL
    V
    V
    18
    V
    (2, 0)

    好处还在于class 也只存储序列和偏移映射,但从不存储肽的拆分序列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 2017-03-10
      • 2017-04-18
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多