gpt4 book ai didi

python - 通过定义函数从文件创建字典

转载 作者:太空宇宙 更新时间:2023-11-03 17:36:51 24 4
gpt4 key购买 nike

我有一个包含以下信息的文件:

#chrom    start    end    isoform
chr1 75 90 NM_100
chr1 100 120 NM_100
chr2 25 50 NM_200
chr2 55 75 NM_200
chr2 100 125 NM_200
chr2 155 200 NM_200

我想从这个文件中创建一个字典,其中 NM_ 是键,开头和结尾是值。就像这样:

dictionary = {NM_100: [(75, 90), (100,120)], NM_200: [(25, 50), (55,75), (100, 125), (155, 200)]}

我一直在尝试使用此代码生成一个函数,该函数允许我压缩开头和结尾,但我似乎无法让它正常工作。

def read_exons(line):
parts = iter(line.split())
chrom = next(parts)
start = next(parts)
end = next(parts)
isoform = next(parts)
return isoform, [(s, e) for s, e in zip(start, end)]

with open('test_coding.txt') as f:
exons = dict(read_exons(line) for line in f
if not line.strip().startswith('#'))

我知道该函数不允许我附加到值,但我正在努力弄清楚如何让一行的开头和结尾正确显示在字典中。有任何想法吗?是 iter()zip 的问题吗?

最佳答案

collections.defaultdict 可能有帮助:

import collections

exons = collections.defaultdict(list)
for line in f:
chrom, start, end, isoform = line.split()
exons[isoform].append((int(start), int(end)))

简单!

<小时/>

这利用了一些优势:

  • 它使用元组解包来解包行列,而不是上面的 iter() 解决方案。一般来说,元组拆包更简单,更容易阅读。
  • 它逐步构建字典,而不是像当前解决方案尝试那样尝试一次完成所有操作(请注意,如果您逐行处理数据,则无法立即收集所有开始/结束对!)
  • 它使用 collections.defaultdict 有效地将每个键映射到一个空列表(最初),这样您就不必检查每个键是否已映射。如果没有defaultdict,你会这样做

    exons = {}
    ...
    if isoform not in exons:
    exons[isoform] = []
    exons[isoform].append(...)

关于python - 通过定义函数从文件创建字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31105786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com