2017-09-04 23 views
0

我試圖獲取位於列表中的單詞中字母的位置。 在代碼中,k是一個包含"ATCGCATCG"的部分的列表,分3部分,如"ATC", "GCA" and "TCG".我想要的是爲每個人都檢索第一個和最後一個位置。在此,ATC應該有1 and 3,因爲A是第一個,而C是第三個。因此,對於GCA,應該是46,等等。檢索存在於字符串中的子字符串的位置

因此,輸出應該是這樣的:

PART1 ATC 1 3 
PART2 GCA 4 6 
PART3 TCG 7 9 

但是什麼我能得到的是:

PART1 ATC 0 0 
PART2 GCA 1 2 
PART3 TCG 2 4 

生產這種輸出的代碼是:

def separate(string,n): 
    k = [string[i:i+n] for i in range(0, len(string),n)] 
    yield k 
    i=1 
    for element in k: 
        print 'PART' + str(i) + '\t' + element + '\t' + str(int(k.index(element))) + str(int((k.index(element)) + int(k.index(element)))) 
        i=i+1 


for it in list((separate("ATCGCATCG", n =3))): 
     print it 

如果您能向我展示一個選項,我將不勝感激。

謝謝!

+0

你在裏面搜索哪裏? –

+0

我編輯得更清晰 – bapors

+0

你不需要在你的函數內部產生循環。它根本不可讀。 –

回答

1
def separate(string,n): 
    k = [string[i:i+n] for i in range(0, len(string),n)] 
    current = string 
    start = 0 
    end = 0 
    for i, element in enumerate(k): 
     start = end + current.index(element) + 1 
     end = start + len(element) - 1 
     current = string[end:] 
     print("PART{i}\t{el}\t{s} {e}".format(i=i, el=element, s=start, e=end)) 

separate("ATCGCATCG", n=3) 

輸出:

PART0 ATC 1 3 
PART1 GCA 4 6 
PART2 TCG 7 9 
1

,因爲每個部分的字符串有固定的長度,我覺得你可以試試這個:

def separate(string,n): 
    k = [string[i:i+n] for i in range(0, len(string),n)] 
    yield k 
    for curr_index in range(len(k)): 
     element = k[curr_index] 
     curr = curr_index * n + 1 
     print ('PART' + str(curr_index + 1) + '\t' + element + '\t' + str(curr) + str(curr + n - 1)) 

for it in list((separate("ATCGCATCG", n =3))): 
     print (it) 

它需要作爲元素的curr_index目前正在for循環中迭代並使用它來計算原始文本中字符串的位置。希望這有幫助

2

IIUC,我認爲你是過於複雜的事情。只需在循環中構建您的字符串並屈服。

def foo(string, n): 
    c = 1 
    for i in range(0, len(string), n): 
     yield '\t'.join(['PART{}'.format(c), string[i : i + n], str(i + 1), str(i + n)]) 
     c += 1 

for i in foo("ATCGCATCG", 3): 
    print(i) 

PART1 ATC 1 3 
PART2 GCA 4 6 
PART3 TCG 7 9 
相關問題