[英]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.