Python入门:按A=T、C=G规则过滤DNA字符串列表的实现问题
问题根源
你的代码输出和目标不匹配的核心问题,出在列表推导式的返回值设计上:
- 推导式循环遍历
range(len(dna))得到的变量i是原DNA列表的整数索引 - 最终推导式收集的元素是索引
i本身,没有取索引对应的序列内容,所以输出自然全是数字
最小改动修正
只需要把推导式中要收集的元素从索引i,换成对应位置的序列值dna[i]即可:
# 修正前(错误写法,收集索引) # 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'))] # 修正后(正确写法,收集对应序列) 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就会直接存储符合规则的DNA字符串,输出形式和你预期的['AACTGACTTG', ...]完全一致。
更简洁的优化写法
不需要借助索引遍历原列表,直接循环取出每个序列对象做判断,代码可读性和健壮性更高:
dna_2 = [ seq for seq in dna if seq.count('A') == seq.count('T') and seq.count('C') == seq.count('G') ]
- 省去了
range(len())的绕弯操作,不需要通过索引间接取值 - 循环变量
seq直接对应单个DNA序列,判断条件的代码逻辑更直观,也能减少索引写错的低级错误
内容的提问来源于stack exchange,提问作者Marta Fredes
相关产品推荐
相关产品推荐

