【问题标题】:Dictionary comprehension with a nested list带有嵌套列表的字典理解
【发布时间】:2021-12-22 04:01:57
【问题描述】:

我有一个字符串和一个字符列表。我希望创建一个字典,其中键是字符 as 而值是列表,只有没有键字符。

一串字符:

sequence = 'ATGCG'

名单:

bases = ['C', 'T', 'A', 'G']

结果字典将是:

{'A': ['C', 'T', 'G'],
 'T': ['C', 'A', 'G'],
 'G': ['C', 'T', 'A'],
 'C': ['T', 'A', 'G'],
 'G': ['C', 'T', 'A'],
}

我尝试使用以下代码,但得到了 4 个项目的列表:

variations = {current_base: [base for base in bases if current_base != base]
              for current_base in sequence}

我很想知道我做错了什么。谢谢。

【问题讨论】:

标签: python dictionary-comprehension


【解决方案1】:

你想做的事是不可能的,字典不能有重复的键。

{'A': ['C', 'T', 'G'],
 'T': ['C', 'A', 'G'],
 'G': ['C', 'T', 'A'],
 'C': ['T', 'A', 'G'],
 'G': ['C', 'T', 'A'], ## this is impossible
}

您可以改用元组列表。我借此机会向您展示一种使用 python 集的更有效的方法:

sequence = 'ATGCG'
bases = set(list('ACGT'))
[(b,list(bases.difference(b))) for b in sequence]

注意。实际上,预先计算差异会更有效,因为您的 DNA 序列可能很长,但只有 4 个碱基

sequence = 'ATGCG'
bases = set(list('ACGT'))
diffs = {b: list(bases.difference(b)) for b in bases}
[(b,diffs[b]) for b in sequence]

输出:

[('A', ['T', 'C', 'G']),
 ('T', ['A', 'C', 'G']),
 ('G', ['T', 'A', 'C']),
 ('C', ['T', 'A', 'G']),
 ('G', ['T', 'A', 'C'])]
使用位置作为键的替代输出:
{i: list(bases.difference(b)) for i,b in enumerate(sequence)}

输出:

{0: ['T', 'C', 'G'],
 1: ['A', 'C', 'G'],
 2: ['T', 'A', 'C'],
 3: ['T', 'A', 'G'],
 4: ['T', 'A', 'C']}

【讨论】:

    【解决方案2】:

    试试这个:

    sequence = 'ATGCG'
    d = {c: list(''.join(set(list(sequence))).replace(c,'')) for c in set(list(sequence))}
    

    【讨论】:

    • 这是无效的。重复的键将被最后一个值覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2021-02-23
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多