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