簡體   English   中英

Python:搜索同一類的對象列表以確​​定object.attribute等於列表中任何對象的某個值

[英]Python: Search through a list of objects of the same class to determine object.attribute equals some value for any of the objects in the list

可以說我有一個帶有屬性的Kmerobj類:kmer(字符串)和locationlist(列表)

class Kmerobj(object):

    def __init__(self,kmer,locationlist):
        self.kmer = kmer
        self.locationlist = locationlist

現在假設我有一些字符串,並且正在遍歷該字符串並創建所有長度為k的子字符串,並將它們作為Kmerobj對象存儲在列表中,其中kmer屬性為子字符串,而locationlist屬性為開始列表該子字符串的網站。 我已經編寫了一個函數來執行此操作。

def kmerizeseq(sequence,kmer_size):
    kmer_list = []
    sequence = sequence.upper()
    if (kmer_size <= len(sequence) and kmer_size >= 1):
        for start in range(0,len(sequence)-kmer_size+1,1):
            kmerseq = sequence[start:start+kmer_size]
            if all(kmerseq != kmerobj.kmer for kmerobj in kmer_list):
                kmerinst = Kmerobj(kmerseq,[start],list(seq_name))
                kmer_list.append(kmerinst)
            else:
                for kmerobj in kmer_list:
                    if kmerseq == kmerobj.kmer:
                        kmerobj.locationlist.append(start)
    return kmer_list

現在這有效。 如果我運行該功能

kmerizeseq('ATCATC',3)

我得到三個對象的清單。 第一個具有kmer屬性'ATC'和locationlist屬性[0,3]。 第二個具有kmer屬性'TCA'和locationlist屬性[1]。 第三個具有kmer屬性'CAT'和locationlist屬性[2]。

我的問題是:有什么方法可以更有效地實現相同的結果? 目前,我正在遍歷整個列表,以確定是否有任何對象具有與輸入相同的kmer屬性,然后再次遍歷該列表以找到匹配的對象並進行修改。

有什么方法可以遍歷列表,如果當前對象的kmer屬性與輸入匹配則停止並修改該對象,如果找不到匹配項,則將新的kmerobj對象添加到列表中? 理想情況下,我只需要遍歷列表一次。

問題 :有什么方法可以更有效地達到相同的結果?

您需要使用kmer Sequence作為密鑰對Kmerobj進行隨機訪問。

考慮一下使用dict的以下內容:

class Kmerobj2(object):
    def __init__(self, kmer):
        """Parameter 'kmer' is a tuple of (kmer,index), e.g ('ATC', 0)"""
        self.kmer = kmer[0]
        self.loc = [kmer[1]]

    def append(self, kmer):
        self.loc.append(kmer[1])

    def locations(self):
        return len(self.loc)

    def __str__(self):
        return "{} => {} location(s) at {}".format(self.kmer, self.locations(), self.loc)

def kmerizeseq2(sequence, kmer_size):
    l = []
    # Create len(sequence) tuples == (seq, i) with kmer_size in ONE loop
    for i, c in enumerate(sequence):
        l.append((sequence[i:i + kmer_size], i))

    print("[{}]{}".format( len(l), l))
    #>>>[6][('ATC', 0), ('TCA', 1), ('CAT', 2), ('ATC', 3), ('TC', 4), ('C', 5)]

    d = {}
    # Aggregate all equal kmer of len kmer_size
    for kmer in l[:(len(sequence)-kmer_size)+1]:
        # kmer exists ?
        if kmer[0] in d:
            # Append kmer.loc to d[kmer]
            d[kmer[0]].append(kmer)
        else:
            # Create a new Kmerobj
            d[kmer[0]] = Kmerobj2(kmer)
    return d

if __name__ == "__main__":
    d = kmerizeseq2('ATCATC',3)
    print("type:{}, {}".format(type(d), d))
    #>>> type:<class 'dict'>, {'CAT': <__main__.Kmerobj2 object at 0xf70634ec>, 'TCA': <__main__.Kmerobj2 object at 0xf70634cc>, 'ATC': <__main__.Kmerobj2 object at 0xf706348c>}

    for kmer in d:
        print("{}".format(d[kmer]))

輸出

 CAT => 1 location(s) at [2] TCA => 1 location(s) at [1] ATC => 2 location(s) at [0, 3] 

使用Python測試:3.4.2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM