【问题标题】:nested dictionary with two keys and one value doesn't give me the proper output具有两个键和一个值的嵌套字典没有给我正确的输出
【发布时间】:2019-09-02 12:44:51
【问题描述】:

the format inside counts.txt我在 50 个文件夹中有 counts.txt 文件,每个文件夹与一个样本相关。我在counts.txt 中有两列:一列是字符串,另一列是数字。我尝试用它们制作一个嵌套字典。我想使用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
}

但它给了我这个错误:

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

【问题讨论】:

  • 能否请您分享一个 counts.txt 样本。在samples_name=natsorted(os.listdir(path1)) 行中,natsorted 是什么?

标签: python list dictionary text directory


【解决方案1】:

问题在于以下几行。

你已经声明了

data_ali[gene]={}

这很好。但是,那么您已经声明了以下内容。

data_ali[gene][samples_name]=reads

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

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

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

【讨论】:

  • 是的,但我必须使用该列表中的名称作为键,但除了这种方法我不知道该怎么做!
  • 您可以使用tuple 代替列表。
  • 但这不是一个解决方案,因为它给了我这样的输出,而不是我提到的那个:'ENSG00000007923': {('Sample_1', 'Sample_1-Leish_011_v2', .... 'Sample_30-leish032_v3'): 133} 只有一个键和值在这里不是全部
  • 你的问题是你为什么会出错。出现错误的原因是因为您使用了密钥列表。如果这有效,您将获得类似于您在上面的评论中使用元组发布的输出。这意味着,您的代码永远无法为您提供所需的输出。您现在可以重写您的问题以寻求解决方案。请同时提供您的源文件。
【解决方案2】:

我不确定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)

【讨论】:

  • 我也尝试了这段代码,但不幸的是它给了我这样的结果:'ENSG00000244425': {'Sample_30-leish032_v3': 0}。问题在于它为您提供了一个示例名称(键)和一个数字(值)。正如我之前提到的,我需要样本名称和编号来定位。示例名称是一个文件夹(目录)名称,counts.txt 文件在每个文件中,其中包含不同的读取(如在我的代码中)!但基因部分对所有人来说都是一样的!
猜你喜欢
  • 2018-06-30
  • 2015-12-22
  • 2019-12-25
  • 1970-01-01
  • 2020-12-30
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多