簡體   English   中英

Python 中的初學者 - 根據條件過濾字符串列表

[英]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'))]

filter() function -> 性能增益

您可以將過濾器 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)

讓我解釋:

  1. filter() function 接收兩個參數:
    1. 第二個參數是要過濾的迭代器/列表。
    2. 第一個參數是 lambda 表達式。 列表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
  2. filter() function 返回一個迭代器,而不是一個列表。 如果您只想將 object 放在for循環中,請使用迭代器。 如果要將 object 存儲在列表中,請使用 cast filtered_dna_sequencies_list = list(filtered_dna_sequencies_iterator)

暫無
暫無

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

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