[英]Beginner in Python - Filter list of strings based on condition
我是 Python 的新手,我正在嘗試根據條件過濾 DNA 序列(字符串)列表。
鑒於我的 DNA 序列隨機列表,我只想在列表中保留 A=T 和 C=G 的序列。
這是我到目前為止所做的,但我獲得了字符串的 position 而不是字符串。 我想知道如何在我的 output 中獲得一個字符串。 任何建議都會很棒,謝謝!
到目前為止,這是我嘗試做的:
import numpy as np
BASES = ('A','C','T','G')
P = (0.2, 0.3, 0.2, 0.3)
def random_dna_sequence(length):
return ''.join(np.random.choice(BASES, p=P) for _ in range(length))
dna = [random_dna_sequence(20) for _ in range(300)] #dna1=300 sequences of 20 characters each
print(dna)
然后,我嘗試獲取僅滿足此條件的序列列表:
# Obtain a list dna_2 with DNA sequences that accomplish this condition only
dna_2 = [i for i in range(len(dna)) if (dna[i].count('A'))== (dna[i].count('T')) and (dna[i].count('C'))== (dna[i].count('G'))]
print(dna_2)
我的 output 正在返回完成此條件的序列的 position,但不返回序列本身(序列):
[29, 41, 66, 85, 88, 117, 142, 174, 201, 226, 231, 246, 250, 279, 294, 299, 306, 338, 370, 372, 381, 404, 420, 486, 519, 579]
而我的願望 output 應該是:
['AACTGACTTG', ...]
謝謝你們!
dna_2 = [i for i in range(len(dna)) if (dna[i].count('A'))== (dna[i].count('T')) and (dna[i].count('C'))== (dna[i].count('G'))]
這里的i
指的是索引(您可能知道但輸入錯誤,因為您在調用.count
時使用了dna[i]
)。
您可以將其更改為dna_2 = [dna[i] for i...]
或更好,只需直接迭代序列字符串,而不是表面上使用索引:
dna_2 = [sequence for sequence in dna if sequence.count('A') ... ]
那應該是
dna_2 = [dna[i] for i in range(len(dna)) if (dna[i].count('A'))== (dna[i].count('T')) and (dna[i].count('C'))== (dna[i].count('G'))]
反而。
對於更優雅的解決方案,只需遍歷列表而不是遍歷索引:
dna_2 = [this_dna for this_dna in dna if (this_dna.count('A'))== (this_dna.count('T')) and (this_dna .count('C'))== (this_dna.count('G'))]
您可以將過濾器 function 與 lambda 表達式一起使用。 過濾器 function 算法在后台進行了優化。
不過,您應該學習 lambda 語法。 Lambda 只是內聯函數。
這是您的問題的語法:
random_dna_sequencies = [random_dna_sequence(20) for _ in range(300)]
filtered_dna_sequencies_iterator = filter(lambda dna_sequency:
dna_sequency.count('A') == dna_sequency.count('T') and
dna_sequency.count('C') == dna_sequency.count('G'),
random_dna_sequencies)
filtered_dna_sequencies_list = list(filtered_dna_sequencies_iterator)
print(filtered_dna_sequencies_list)
讓我解釋:
filter()
function 接收兩個參數:
random_dna_sequencies
(表示每個 dna 序列)中的每個元素都作為參數傳遞給 lambda function 作為參數,命名為dna_sequency
。 參數在dna_sequency.count('A') == dna_sequency.count('T') and dna_sequency.count('C') == dna_sequency.count('G')
條件下進行測試。 只有滿足條件的才會返回到變量filtered_dna_sequencies_iterator
。filter()
function 返回一個迭代器,而不是一個列表。 如果您只想將 object 放在for
循環中,請使用迭代器。 如果要將 object 存儲在列表中,請使用 cast filtered_dna_sequencies_list = list(filtered_dna_sequencies_iterator)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.