如何用字典推导式一行代码将FastQ文件内容存入字典?
用字典推导式改写FastQ文件的字典存储代码
问题背景
我有一个FastQ格式的文件(以下为部分内容):
@SRR12345678.1 GAGCCATATGACCACGCCGGAGAATCTCGCCAAGCAGGCAAAGCTGATGGAAGGCTACGGTGCGCCCTGTTTTTAT +SRR12345678.1 -@CCCGGGGFFGGCFGGGEEDFDFFGDFCEE,:@FDC8FE8,@FC8FFC,EFDFGE@FA,C9CE99F@7B7+CCE,CF,,6C,,C,+8++8++ @SRR12345678.5 CTTTATGCCCCCACAGTGCGATCAGGAAGTACATCGGCACCAGCATCATTTCCCAGAAGAAGAAGAACATGAACAT +SRR12345678.5 CCCCCGFGGGGGDGDCFCFEDFEEDC?CDE9FAFGECF>FF8,C,FE8CEEFFF,,,,,,,,,,,,,C,,,,,:,: @SRR12345678.6 GTCGATGGCCTGAACTACTCACGCTTCGAGAAGCAGATGCCTGCGCTGGCAGGTTTTGCTGAGCAAAATATTTCGT +SRR12345678.6 -ACCCGFFGGGFCFGGGGGGGGCFGEGD8C878FAFGGCEFFEF7CFC7@,A+CEFD,CF,,,:,,,,:,
目前使用以下代码将文件内容存入字典:
file = open("test.fastq") d={} for i in file: d_key, *d_value = i.split() d[d_key] = d_value
由于文件体积较大,需仅使用字典存储,请问能否将上述循环用字典推导式写成一行代码?
解决方案
当然可以用字典推导式把这段循环简化为一行代码。以下是两种实现方式:
推荐写法(自动管理文件句柄)
with open("test.fastq") as file: d = {line.split()[0]: line.split()[1:] for line in file if line.strip()}
对应原始写法(不推荐,存在文件句柄泄漏风险)
d = {line.split()[0]: line.split()[1:] for line in open("test.fastq") if line.strip()}
代码说明
for line in file:遍历文件的每一行内容line.split()[0]:将每行按空白分割后,取第一个元素作为字典的键,和原始代码中d_key的作用一致line.split()[1:]:取分割后的剩余元素组成列表作为值,和原始代码中*d_value的效果完全匹配if line.strip():过滤空行,避免处理空白行时出现索引错误,让代码更健壮
内容的提问来源于stack exchange,提问作者Breathe of fate
相关产品推荐
相关产品推荐

