【问题标题】:Create a new dictionary with each iteration of loop每次循环迭代创建一个新字典
【发布时间】:2017-03-30 21:32:47
【问题描述】:

我正在尝试从 VCF 文件中提取位置和 SNP。到目前为止,我已经写了以下内容。但是如何更改字典的名称,以便每个输入文件都有一个字典呢?

即:python vcf_compare.py file1.vcf file2.vcf file3.vcf

import sys

import vcf

for variants in sys.argv[1:]:
    file1 = {} 
    vcf_reader = vcf.Reader(open(variants))
    for record in vcf_reader:
        pos = record.POS
        alt = record.ALT
        ref= record.REF
        snps[pos]=ref,alt

所以为 argv[1] 创建了一个名为 file1 的字典。如何使字典名称更改为例如为循环的第二次迭代归档二?

【问题讨论】:

  • 我会保留一个字典列表,然后每次都将新字典添加到列表中。如果您希望能够通过某个名称访问它们中的每一个,那么制作一个字典字典,每个键都是您想要的名称。
  • 使用容器
  • 并确保您使用已接受的答案。归结为使用字典。但既然你想要有序的、编号的“变量”,也许一个列表就可以了。
  • 以后你会如何参考字典?

标签: python bioinformatics vcf-variant-call-format


【解决方案1】:

简短的回答:你不能。对于许多早期的程序员来说,这是一个令人难以置信的令人沮丧的事实。修复:另一本字典!在variants for 循环之外,创建另一个字典并将文件名用作键。示例(你不能只是复制粘贴这个,因为我不知道如何使用 vcf 库):

import sys

import vcf

all_files = {}
for variants in sys.argv[1:]:
    #didn't see file1 used, and didn't see snps created
    #so figured file1 was snps...
    snps = {} 
    vcf_reader = vcf.Reader(open(variants))
    for record in vcf_reader:
        pos = record.POS
        alt = record.ALT
        ref= record.REF
        snps[pos]=ref,alt
    all_files[variants] = snps

我在这里假设variants 是一个字符串形式的文件名。如果不是,请将all_files[variants] 中的variants 替换为您要用作其键的字符串。

【讨论】:

    【解决方案2】:

    你应该使用collections.defaultdict,也应该使用with open(...)

    from collections import defaultdict
    
    files = defaultdict(dict)
    for filename in sys.argv[1:]:
        with open(filename) as f:
            vcf_reader = vcf.Reader(f)
            for record in vcf_reader:
                files[filename][record.POS] = record.REF, record.ALT
    

    所有这些漂亮的 Python 技巧使代码更具可读性、更短,使用的中间临时变量更少。此外,使用with open() 可确保每个文件在读取后自动关闭。

    此外,如您所见,您可以选择更好的变量名,同时也大大减少了代码行数。

    【讨论】:

    • 或者你可以使用一个列表。
    • 当然。使用 defaultdict 的唯一优点是 OP 可以通过动态生成的键名而不是使用索引来访问其内容。
    • @juanpa.arrivillaga OP 似乎想要按名称访问,而不是需要跟踪索引。字典允许将字符串用作键,因此比列表更适合指示的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多