2016-03-07 88 views
2

我有一個字符串,我想在整個長度的每個位置上操作。更改列表中的多個位置

例如,我有一個字符串,它看起來是這樣的:

string1 = 'AATGCATT' 

我想創造一個我改變一個位置在時間中的一個A,T,C或G列表我想使用的方法作爲這樣的:

liststring = list(string1) 
changedstrings = [] 
for pos in range(2, len(liststring) - 2): ##I don't want to change the first and last to characters of the string 
    if liststring[pos] != 'A': 
     liststring[pos] = 'A' 
     random1 = "".join(liststring) 
     changedstrings.append(random1) 

我想使用類似的方法來附加的變化,其餘的(改變位置G,C的其餘部分,和T)到列表上面生成。但是,當我打印changedstrings列表時,看起來這個代碼在前兩個之後將所有位置更改爲A.我真的只是想將位置3更改爲'A'並追加到列表中。然後將位置4更改爲'A'並追加到列表中,依此類推給我一個列表:

changedstrings = ['AAAGCATT', 'AATACATT', 'AATGAATT'] 

有什麼建議嗎?

+0

@Selcuk修正 – interstellar

+1

目前尚不清楚你所說的「這個字符串的所有可能的變化中關於A,T,C和G的」的意思。這在後面的描述中沒有幫助。你想要產生什麼樣的組合/排列組合? – jpmc26

+0

[如何在Python中生成列表的所有排列]可能的重複(http://stackoverflow.com/questions/104420/how-to-generate-all-permutations-of-a-list-in-python) – intboolstring

回答

2

您正在重新使用舊的liststring變量。初始化它的循環,而不是內部:

changedstrings = [] 
for pos in range(2, len(liststring) - 2): 
    liststring = list(string1) # Move this line here 
    if liststring[pos] != 'A': 
     liststring[pos] = 'A' 
     random1 = "".join(liststring) 
     changedstrings.append(random1) 
print(changedstrings) 

結果

['AAAGCATT', 'AATACATT', 'AATGAATT'] 
+0

完美。謝謝。 – interstellar

+0

如果我想對其他字符做同樣的事情,我仍然可以將新的'randoms'追加到同一個'changedstrings'列表中,對吧? – interstellar

+0

如果你只是複製/粘貼其他氨基酸的'for'循環,是的,但也有更短的方法,請參閱@intboolstring – Selcuk

0

從我明白你的問題,你需要兩個循環。一個用於職位(除了第一個和最後一個),另一個用於四個字母(核酸?)A,T,G,C。您可以決定首先放置哪個循環。

要更改除首位和最後位置以外的所有位置,應爲for pos in range(1, len(liststring)-1):。查看range函數的文檔。也看看索引如何在python中工作。

string1 = 'AATGCATT' 
changedstrings = [] 
for new_char in ('A','T','G','C'): 
    for pos in range(1, len(string1)-1): 
    if string1[pos] != new_char: 
     liststring = list(string1) 
     liststring[pos] = new_char 
     changedstrings.append("".join(liststring)) 
print (changedstrings)