带有嵌套列表的字典理解

Dictionary comprehension with a nested list

我有一串字符和一个字符列表。我想创建一个字典,其中键是字符 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}

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

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

{'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']}

试试这个:

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