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