【问题标题】:how to append keys and values from nested dictionaries to lists如何将嵌套字典中的键和值附加到列表
【发布时间】:2019-09-20 19:28:50
【问题描述】:

我构建了三个嵌套字典来分析我的大数据。我尝试对它们内部的值进行任何分析以制作散点图,因此我正在创建一个列表以将我的数据附加到它们,然后通过 matplotlib 制作散点图。我的问题是我在尝试追加时遇到错误!类型错误:不可散列类型:“列表”。所以我很困惑改变我的字典的结构,或者有可能通过我创建的这个来处理它。

我的字典结构分别如下:

data_geo1:

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

data_ali:

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

这是我从头开始的所有代码结构,正如您在最后几行中看到的那样,我尝试创建列表并将我的值附加到列表中,但我无法成功。

import os
import numpy as np
import matplotlib.pyplot as plt

path = "/home/ali/Desktop/data/"
root = "/home/ali/Desktop/SAMPLES/"



data_geo1={}
with open(path+"GSE98212_H_DE_genes_count.txt","rt") as fin: #data for sample 1-30
    h = fin.readline()
    sample1 = h.split()
    sample_names = [s.strip('"') for s in sample1[1:31]]
    for l in fin.readlines():
        l = l.strip().split()
        if l:
            gene1= l[0].strip('"')
            data_geo1[gene1] = {}
            for i, x in enumerate(l[1:31]):
                data_geo1[gene1][sample_names[i]] = int(x)

#print(data_geo1)

data_geo2={}
with open (path+"GSE98212_L_DE_genes_count.txt","rt") as fin:
    h= fin.readline()
    sample2=h.split()
    sample_names=sample2[1:21]
    for l in fin.readlines():
        l = l.strip().split()
        if l:
            gene2= l[0].strip()
            data_geo2[gene2]={}
            for i,x in enumerate (l[1:21]):
                data_geo2[gene2][sample_names[i]]= int(x)
#print(data_geo2)

data_ali={}

for sample_name in os.listdir(root):
    with open(os.path.join(root, sample_name, "counts.txt"), "r") as fin:
        for line in fin.readlines():
            gene, reads = line.split()
            reads = int(reads)
            if gene.startswith('ENSG'):
                data_ali.setdefault(gene, {})[sample_name] = reads
        gene = l[0].strip()
#print(data_ali)

list_samples= data_ali[gene].keys()
#print(list_samples)
for sample in list_samples:
    reads_data_ali = []
    for gene in data_ali.keys():
        reads_data_ali.append(data_ali[gene][sample_name])

我希望输出如下:

[[0, 0], [0, 2], [11, 12], [4, 4], [18, 17], [2, 2], [381, 383], [1019, 1020], [198, 194], [66, 65], [2223, 2230], [30, 30], [0, 0], [33, 34], [0, 0], [411, 409], [804, 803], [11829, 7286], [137, 139], [277, 278], [3475, 3482], [5, 5], [2, 1], [70, 70], [48, 48], [234, 232], [121, 120], [928, 925], [220, 159], [165, 165], [702, 700], [1645, 1643], [79, 78], [1064, 1067], [971, 972], [0, 0]]

【问题讨论】:

  • 你为什么期待这样的输出?您提供的输入中的这些值在哪里?
  • 如果您尝试将问题分解为最小示例,则会增加获得帮助的机会。此外,您的代码中似乎有一些重复,这表明您可以通过重构(例如引入函数)来提高可读性。您也可以查看 dict 理解: data_geo2[gene2] = {[sample_names[i]]: int(x) for i,x in enumerate(l[1:21])} 最后但并非最不重要的一点:您的错误消息似乎表明您的数据集本身存在问题。你检查是否相应?使用调试器或至少打印?关于这个案子,它告诉了你什么?
  • 我想在下一步创建一个 numpy 数组来创建散点图并将这些值一起比较,这些值是我字典中的数字。
  • 它在创建列表之前运行良好!没问题!

标签: python list dictionary append


【解决方案1】:

您可以尝试通过在 .append(...) 之前检查该键是否存在于您的字典中来避免键错误。尝试查看字典 .get() 方法。有利于防止此类错误。

【讨论】:

  • 当我把我的一把钥匙放进去时它会响应,它给了我价值!问题不在于它!
【解决方案2】:

至于您的描述,我想您制作 data_alidata_geo1 字典的代码得到了正确的输出,所以问题可能出在最后一个制作列表的代码中。 我发现两个问题: 1 for gene in data_ali.keys():,在下面的循环中,reads_data_geo1.append(data_geo1[gene1][sample_names]),这里是[gene1] 2for sample in list_samples:,所以也许你应该使用reads_data_ali.append(data_ali[gene][sample]) 您可以修改这些变量的名称,看看它是否有效。

【讨论】:

  • 我通过编辑第一个 [gene] 得到响应,然后我使用 [sample_name]。
  • 很高兴知道您已经修复了这些错误。不客气!
  • 我已修复,但它不是我正在寻找的那个,但至少它给了我一个回应!现在我只是编辑,我希望尽快得到正确的:)
  • 修改代码后,我看的更清楚了。我建议你检查两点:
  • 昨晚你修改了代码后,我有一个新问题。我建议你检查这一点:1。 for sample in list_samples,当我们得到元素时,我们不能使用data_ali[gene][sample_name]sample是一个变量,sample_name不会是你想要的。它们是两个不同的变量。也许你应该修改这部分,这样计算机就会知道在哪里找到元素。2.顺便看看你的数据类型是不是字典,你开始显示的数据没有完整的大括号对。 (或者也许这是一个错字。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2018-06-27
  • 2020-06-01
  • 1970-01-01
  • 2022-01-06
  • 2021-01-26
相关资源
最近更新 更多