【问题标题】:Add nested values to current dictionary composed of lists of values将嵌套值添加到由值列表组成的当前字典
【发布时间】:2020-07-04 02:03:46
【问题描述】:

我制作了一个名为 ogseqs 的字典,其中包含对应于基因列表的正交组 ID(称为 og)。

ogseqs[og]=genelist 
{'OG0000000': ['Acrchr1_1567', 'Acrchr1_2725', 'Acrchr1_2932']}

我想创建一个嵌套字典,其中还将包含基因列表中每个基因的序列。我制作了另一本名为geneseqs 的字典,其中的基因与其序列相对应。

geneseqs[geneID]=sequence
geneseqs = {'Acrchr1_1567': 'MAFL...', 'Acrchr1_2725': 'MFA...', 'Acrchr1_2932': 'MLA...', 'Annmae1_197712': 'MAF...', 'Annmor1_367154': 'MLF...', 'Annmae1_150166': 'MFL...'}

我在合并/嵌套这些词典时遇到问题。我试过简单地分配这样的序列:


genelist:['Acrchr1_1567', 'Acrchr1_2725', 'Acrchr1_2932']

ogseqs={'OG0000000': ['Acrchr1_1567', 'Acrchr1_2725', 'Acrchr1_2932']}
geneseqs={'Acrchr1_1567': 'MAL...', 'Acrchr1_2725': 'MFA...', 'Acrchr1_2932': 'MLA...'}

ogseqs[og][geneID]={}

for geneID in genelist:
    if geneID in geneseqs.keys():
        ogseqs[og][geneID]=sequence


但我明白了

TypeError: 列表索引必须是整数或切片,而不是 str

所以我认为部分问题在于 ogseqs 中的值在列表中,而不是单个值。我认为这意味着我需要在分配嵌套值之前添加一行来划分这个列表。

完整输入:


ogseqs = {'OG0000000': ['Acrchr1_1567', 'Acrchr1_2725', 'Acrchr1_2932'], 'OG0000001': ['Annmae1_197712', 'Annmor1_367154', 'Annmae1_150166']}
geneseqs = {'Acrchr1_1567': 'MAFL...', 'Acrchr1_2725': 'MFA...', 'Acrchr1_2932': 'MLA...', 'Annmae1_197712': 'MAF...', 'Annmor1_367154': 'MLF...', 'Annmae1_150166': 'MFL...'}

预期输出:


{'OG0000000': {'Acrchr1_1567': 'MAL...', 'Acrchr1_2725': 'MFA...', 'Acrchr1_2932': 'MLA...'}, 
'OG0000001': {'Annmae1_197712': 'MAF...', 'Annmor1_367154': 'MLF...', 'Annmae1_150166': 'MFL...'}}

【问题讨论】:

  • 您现在的确切输入是什么?
  • 我添加了准确的输入以帮助澄清
  • 感谢您更新问题。我们没有你的档案。为了让我们开始工作,请提供实际数据。例如:假设你想找到一个列表的最大值,你应该提供类似输入:[1,2,5,3,7,4],预期输出:7,当前代码:,当前输出:3。为此我们不需要知道这个列表是如何形成的。
  • 感谢您在这里耐心等待。输入很长,所以为了简化可以缩短它们并说输入是 ogseqs 字典 {'OG0000000': ['Acrchr1_1567', 'Acrchr1_2725', 'Acrchr1_2932']} 和geneseqs 字典 {'Acrchr1_1567': ' MAL...', 'Acrchr1_2725': 'MFA...', 'Acrchr1_2932': 'MLA...'}
  • 如果是这种情况,我希望输出为 {'OG0000000': {'Acrchr1_1567': 'MAL...', 'Acrchr1_2725': 'MFA...', 'Acrchr1_2932 ': 'MLA...'}} 基本上,如果我们可以让它工作,我文件中的完整列表也应该工作

标签: python list dictionary nested


【解决方案1】:

假设您当前的数据如下所示:

ogseqs = {'OG0000000': ['Acrchr1_1567', 'Acrchr1_2725', 'Acrchr1_2932'],
          'OG0000001': ['Annmae1_197712', 'Annmor1_367154', 'Annmae1_150166']
}
geneseqs = {'Acrchr1_1567': 'MAFL...', 'Acrchr1_2725': 'MFA...', 'Acrchr1_2932': 'MLA...',
            'Annmae1_197712': 'MAF...', 'Annmor1_367154': 'MLF...', 'Annmae1_150166': 'MFL...'
}

在 for 循环中执行 ogseqs[og][geneID]=sequence 将不起作用,因为 ogseqs[og] 是一个列表,geneID 是一个字符串,因此 Python 抱怨您正在尝试使用字符串而不是 int 查找列表索引。这样做的方法(但在这种情况下不正确)是用ogseqs[og] = geneseqs[geneID] 替换该行。但是,它会覆盖您现有的 og 序列列表。

您可以就地更新 ogseqs,但这会变得不必要地复杂。创建具有您想要的结构的新字典更容易,但可能会占用更多内存,具体取决于您的起始数据与每个循环的数据。

og = 'OG0000000'
genelist = ['Acrchr1_1567', 'Acrchr1_2725', 'Acrchr1_2932']
nested_ogseqs = {}  # new
nested_ogseqs[og] = {}  # create `og` in the new one

for geneID in genelist:
    if geneID in geneseqs:  # don't need `geneseqs.keys()` since iterates over keys anyway
        nested_ogseqs[og][geneID] = geneseqs[geneID]

>>> nested_ogseqs
{'OG0000000': {'Acrchr1_1567': 'MAFL...', 'Acrchr1_2725': 'MFA...', 'Acrchr1_2932': 'MLA...'}}

但如果您的目标是在没有预设 oggenelist 的情况下简单地转换/创建 ogseqs 的嵌套版本,您可以这样做:

#`ogseqs` and `geneseqs` as above

nested_ogseqs = {}  # new
for og, genelist in ogseqs.items():
    nested_ogseqs[og] = {}  # create `og` in the new one
    for geneID in genelist:    
        nested_ogseqs[og][geneID] = geneseqs[geneID]  # create `og` in the new one

>>> nested_ogseqs
{'OG0000000': {'Acrchr1_1567': 'MAFL...', 'Acrchr1_2725': 'MFA...', 'Acrchr1_2932': 'MLA...'},
 'OG0000001': {'Annmae1_197712': 'MAF...', 'Annmor1_367154': 'MLF...', 'Annmae1_150166': 'MFL...'}}

可以简写为:

nested_ogseqs = {}  # new
for og, genelist in ogseqs.items():
    nested_ogseqs[og] = {geneID: geneseqs[geneID] for geneID in genelist}

这样的缺点是:如果一个geneID不在geneseqs中,比如缺失或尚不存在的数据,则需要保存原来的ogseqs,重新创建nested_ogseqs 稍后或该 og 的基因列表丢失。

【讨论】:

  • 这适用于简化版!谢谢你希望它会与我的完整列表有关
  • 不客气。请参阅我的最后一次编辑,了解如何使用完整的原始字典进行操作。欢迎来到 SO!阅读:What should I do when someone answers my question?
  • 另外,我的帖子被否决是有原因的吗?我怎样才能改进它,以免发生这种情况?
  • 我也不担心geneIDs不在geneseqs中,所以我想我可以跳过这一步。
  • 我明白了。非常感谢所有的帮助。我以后的帖子会更简洁的
猜你喜欢
  • 2021-01-26
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多