Python 使用循环的每次迭代创建一个新字典

Python 使用循环的每次迭代创建一个新字典,python,bioinformatics,vcf-variant-call-format,Python,Bioinformatics,Vcf Variant Call Format,我试图从VCF文件中提取位置和SNP。到目前为止,我已经写了以下内容。但是如何更改字典的名称,使每个输入文件都有一个字典 i、 例如: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文件中提取位置和SNP。到目前为止,我已经写了以下内容。但是如何更改字典的名称,使每个输入文件都有一个字典

i、 例如: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的字典。如何使字典在循环的第二次迭代中将名称更改为文件2?

您应该使用
collections.defaultdict
,也可以使用
和open(…)

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


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

您应该使用
集合。defaultdict
,也可以使用
和open(…)

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


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

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


这里我假设
variants
是一个字符串形式的文件名。如果没有,请将
所有文件[变体]
中的
变体替换为要用作其键的字符串。

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


这里我假设
variants
是一个字符串形式的文件名。如果没有,请将
所有文件[variants]
中的
变体替换为要用作其键的字符串。

我会保留一个词典列表,然后每次只需将新词典添加到列表中即可。如果您希望能够通过某个名称访问它们中的每一个,那么制作一个字典字典,每个键都是您想要的名称。使用容器。可能的重复项,并确保使用接受的答案。这可以归结为一个dict。但是既然你想要有序的、编号的“变量”,也许一个列表就可以了。你以后会如何参考字典?我会保留一个字典列表,然后每次都把新的添加到列表中。如果您希望能够通过某个名称访问它们中的每一个,那么制作一个字典字典,每个键都是您想要的名称。使用容器。可能的重复项,并确保使用接受的答案。这可以归结为使用一个dict。但是既然你想要有序的、有编号的“变量”,也许一个列表就可以了。你以后怎么查字典?或者你可以使用一个列表。当然可以。使用defaultdict的唯一优点是OP可以通过动态生成的密钥名而不是索引来访问其内容。@juanpa.arrivillaga OP似乎希望通过名称来访问,而不需要跟踪索引。字典允许字符串用作键,因此比列表更适合指定的需要。当然,也可以使用列表。使用defaultdict的唯一优点是OP可以通过动态生成的密钥名而不是索引来访问其内容。@juanpa.arrivillaga OP似乎希望通过名称来访问,而不需要跟踪索引。字典允许字符串用作键,因此比列表更适合指定的需要。
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
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