带有两个键和一个值的嵌套字典无法提供正确的输出

时间:2019-04-11 19:36:54

标签: python list dictionary text directory

the format inside counts.txt我在50个文件夹中拥有counts.txt个文件,每个文件都与一个样本相关。我在counts.txt中有2列:一列是字符串,另一列是数字。我试图用它们制作一个嵌套的字典。我想将counts.txt的第一列和文件夹用作键,并将counts.txt的第二列用作值。不幸的是,我想与它们循环的文件夹列表没有响应,并给我一个错误!

data_ali = {}

samples_name=natsorted(os.listdir(path1))
for i in samples_name:    
    with open(path1+i[0:]+"/counts.txt","rt") as fin:    
        for l in fin.readlines():    
            l=l.strip().split()    
            if l[0][:4]=='ENSG':    
                gene=l[0]    
                data_ali[gene]={}       
                reads=int(l[1])    
                data_ali[gene][samples_name]=reads
print(data_ali)

我希望命令的输出像:

'ENSG00000120659': {
    'Sample_1-Leish_011_v2': 14,
    'Sample_2-leish_011_v3': 7,
    'Sample_3-leish_012_v2': 6,
    'Sample_4-leish_012_v3': 1,
    'Sample_5-leish_015_v2': 9,
    'Sample_6-leish_015_v3': 3,
    'Sample_7-leish_016_v2': 4,
    'Sample_8-leish_016_v3': 8,
    'Sample_9-leish_017_v2': 8,
    'Sample_10-leish_017_v3': 2,
    'Sample_11-leish_018_v2': 4,
    'Sample_12-leish_018_v3': 4,
    'Sample_13-leish_019_v2': 7,
    'Sample_14-leish_019_v3': 4,
    'Sample_15-leish_021_v2': 12,
    'Sample_16-leish_021_v3': 5,
    'Sample_17-leish_022_v2': 4,
    'Sample_18-leish_022_v3': 2,
    'Sample_19-leish_023_v2': 9,
    'Sample_20-leish_023_v3': 6,
    'Sample_21-leish_024_v2': 22,
    'Sample_22-leish_024_v3': 10,
    'Sample_23-leish026_v2': 9,
    'Sample_24-leish026_v3': 5,
    'Sample_25-leish027_v2': 4,
    'Sample_26-leish027_v3': 1,
    'Sample_27-leish028_v2': 7,
    'Sample_28-leish028_v3': 5,
    'Sample_29-leish032_v2': 8,
    'Sample_30-leish032_v3': 2
}

但是它给了我这个错误:

  

不可散列的类型:“列表”

2 个答案:

答案 0 :(得分:1)

问题在于以下几行。

您已声明

data_ali[gene]={}

这很好。但是,然后您声明了以下内容。

data_ali[gene][samples_name]=reads

根据您的代码,我假设samples_name是目录列表。如果是这种情况,则会出现错误error: unhashable type: 'list',因为您不能将列表用作字典的键,因为列表是可变的(可以修改)。

要克服此错误,您可以使用元组

data_ali[gene][tuple(samples_name)]=reads

答案 1 :(得分:0)

我不确定samples_name是什么,但是我想您想创建一个密钥 对于每个样本:

data_ali = {}

samples_name=natsorted(os.listdir(path1))
for i in samples_name:    
    with open(path1+i[0:]+"/counts.txt","rt") as fin:    
        for l in fin.readlines():    
            l=l.strip().split()    
            if l[0][:4]=='ENSG':    
                gene=l[0]    
                data_ali[gene]={}       
                reads=int(l[1]) 
                data_ali[gene][i]=reads
print(data_ali)